タイトル説明
夢のクラスが異なる食品の人気を示す上記、当然のことながら、調達タスクを担当するA夢を食べることが不可欠で、彼はリストを持って、パーティーを開催し、A夢はいくつかを必要とします達成することが可能な限り大きな人気価格!例えば、20種の人気は、メロンの種の価格は$ 50であり、そしてA夢の種を購入することを選択した場合、$ 50の費用がかかりますが、人気が20増加しています。食品の単調さを避けるために、各食品は一つだけを購入することができ、あなたは繰り返しの購入をすることはできません。夢は今、あなたは彼を助けることができる、最大の人気を達成するために購入する方法を知っておく必要がありますか?
エントリー
入力データ、2つの正の整数をそれぞれM及びN(M <100 && N <1000)、のそれぞれの第1入力ライン、及びアイテムのマネーA夢処分カテゴリのリスト上の選択可能な数の複数のセット。次のN行はそれぞれ、2つの正の整数であり、その人気の各アイテムの価格が(N 1と番号付け)。
輸出
購入したアイテムがある場合、最初の行為の出力は、最大の人気を実現しています。(辞書フロント出力のいくつかの可能な種類が存在する場合)商品を第二のラインを購入する必要は、スペースで各数値を分離しない;商品が購入できない場合は、出力の一方のみ行、番号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.大きな進展は限られたお金で最大の人気を取得する方法を見つけ出すことです。
まず、個々の項目がソートされているよりも、その人気の価格、より大きく、より費用対効果の比率。
袋のお金は高コストのアイテムを購入することができた場合4.次に、可能な場合は、この操作を繰り返し、スキップ、そうでない場合は、お金の袋を削減します。
5.それを解決する方法を、既成の秩序をひっくり返すことができるか、コードである数だけでなく、財の輸出は、ソートされることに留意すべきですか アイテム番号iが構造内に追加し、入力に提供されてもよいです。