贪心法:部分背包问题

每个物品都可以拿走一部分,要在不超重的情况下总价值最高,这应该是最简单的一类贪心问题了,思路很明显,考虑性价比即可,安装性价比排序,从高到低开始拿,除了最后一个物品之外,要么不拿,要么拿走全部,具体实现如下。请注意结果的细节,对最后一个物品的处理。

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 const int maxn=1005;
 5 int n;
 6 int C;
 7 int ans=0; 
 8 struct Object
 9 {
10     int w;  //weight
11     int v;  //value
12     double re;
13 }a[maxn];
14 bool cmp(Object x,Object y)
15 {
16     return x.re>y.re;
17 }
18 int main()
19 {
20     cin>>n;
21     for(int i=1;i<=n;i++)
22     {
23         cin>>a[i].w>>a[i].v;
24         a[i].re=a[i].v*1.0/a[i].w;
25     }
26     cin>>C;
27     sort(a+1,a+n+1,cmp);
28     int tmp=0;
29     for(int i=1;i<=n;i++)
30     {
31         tmp+=a[i].w;
32         if(tmp<=C)
33             ans++;
34         else
35             break;
36     }
37     cout<<ans<<endl;
38     return 0;
39 }

 

posted @ 2018-07-06 12:09  静听风吟。  阅读(198)  评论(0编辑  收藏  举报