题意:
给定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 }
浙公网安备 33010602011771号