算法——Buyer

題目描述

哆啦A夢班級舉辦個party,當然喫的東西必不可少,哆啦A夢負責採購任務,他得到了一份清單,上面註明不同食品的受歡迎程度,哆啦A夢需要用一定的價錢儘可能達到的更大的受歡迎程度!例如,瓜子的受歡迎程度爲20,瓜子的價錢是50元,那麼如果哆啦A夢選擇買瓜子,將花費50元,但受歡迎程度增加了20。爲了避免食品單調性,每種食品只能買一份,不能重複購買。 現在哆啦A夢需要知道如何採購才能達到最大的受歡迎程度,你能幫助他嗎?

輸入

輸入數據爲多組,每組輸入的第一行有兩個正整數M和N(M<100&&N<1000),分別爲哆啦A夢可以支配的錢數和清單上的可選擇的物品種類。 接下來的N行每行有兩個正整數,分別爲每種物品的價錢和它的受歡迎程度(編號爲1到N)。

輸出

如果存在物品購買,那麼輸出的第一行爲能夠達到的最大的受歡迎程度。第二行爲需要購買的物品的編號(如果有多種可能,輸出字典序靠前的那種),空格分隔每個數字;如沒有物品可以購買,輸出只有一行,爲數字0。

樣例輸入

10 4
100 5
5 5
5 5
10 10

樣例輸出

10
2 3

代碼

#include<iostream>
#include<algorithm>
using namespace std;
typedef struct{
	int price;
	int popular;
	int i;
}Gs;
Gs p[1000];
bool cmp(Gs p1, Gs p2){
	return (p1.popular /p1.price )>(p2.popular /p2.price );
}
int main(){
	int ans, s ,a[1000];
	int M,N;
	while(cin>>M>>N){
		ans = 0, s = 0;
		for(int i = 0; i < N; i++){
			cin>>p[i].price >>p[i].popular ;
			p[i].i = i + 1;
		}
		sort(p, p + N, cmp);
		for(int i = 0; i < N && M >0; i++){
			if(M - p[i].price < 0) continue;
			M -= p[i].price ;
			ans += p[i].popular ;
			a[s++] = p[i].i ;
		}
		if(s == 0) cout<<"0"<<endl;
		else {
			cout<< ans << endl;
			sort( a, a+s);
			for(int i = 0; i < s - 1; i++)
				cout<<a[i] <<' ';
			cout<<a[s-1]<<endl;
		}
	}
	return 0;
} 

思路

1.第二次上手發現這道題是比較簡單的;

2.主要的突破口是要搞清楚如何在有限的money內得到最大的受歡迎程度;

3.首先,單個物品的受歡迎程度與其價格之比進行排序,比值越大,性價比更高;

4.然後,包裏的money是否可以買到性價比高的物品,如果可以,包裏的money就會減少啦,反之,就跳過,重複這條操作;

5.要注意的是,還要輸出物品的編號,代碼裏面是會進行排序的,可能會打亂原有的順序,要怎麼解決呢?可以在結構體裏面添加物品序號 i ,並在輸入時進行設置。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章