ALLap

导航

 

题意:

  给定n种物品和一个容量为M的背包。物品的重量分别是Wi,其价值为Vi。应如何选择装入背包的物品,使得装入背包中物品的总价值最大?

  与普通的0-1背包不同的是,对于每一件物品,可以选择只装入物品的一部分!!

分析:

  此时贪心的想法自然是,优先选择单位重量价值最高的物品啦!直到装满。

代码:

 1 #include<algorithm>
 2 #include<iostream>     
 3 using namespace std;
 4 
 5 struct Thing
 6 {
 7     float w;
 8     float v;
 9 };
10 
11 bool compare(Thing a,Thing b)
12 {
13     return (a.v/a.w)>(b.v/b.w);//按单位价值比较
14 }
15 
16 int main()    
17 {   
18     int n;
19     while(cin>>n)
20     {
21         int M;
22         cin>>M;
23         Thing *thing=new Thing[n];
24         for(int i=0;i<n;i++)
25         {
26             cin>>thing[i].w>>thing[i].v;
27         }
28         sort(thing,thing+n,compare);
29         float sum=0;
30         int j=0;
31         for(j=0;j<n;j++)  
32         {    
33             if(thing[j].w>M)
34                 break;     
35             sum+=thing[j].v;//可以取整件
36             M-=thing[j].w; 
37         }
38         if(j<n)//只能取部分
39             sum+=M/thing[j].w*thing[j].v;
40         cout<<sum<<"\n";
41         delete []thing;
42     }
43     return 0;
44 }

 

  

posted on 2016-12-20 19:54  ALLap  阅读(313)  评论(0)    收藏  举报