http://acm.hdu.edu.cn/showproblem.php?pid=2546
本题要利用一点贪心的思想,买的时候不买最贵的菜,且留下5元买用来买最贵的菜.
剩下的就是01背包的问题了.
由于刚学背包,对背包额理解不够深刻.
所以坑了很久.
//View Code
1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 const int MAX = 1100; 5 int c[MAX]; 6 int w[MAX]; 7 int f[MAX]; 8 void ZeroOnePack(int v,int cost,int weight) 9 { 10 int i; 11 for(i=v;i>=cost;i--) 12 { 13 f[i] = max(f[i],f[i-cost]+weight); 14 } 15 } 16 int main() 17 { 18 int n; 19 int v; 20 while(cin>>n,n) 21 { 22 int i; 23 for(i=0;i<n;i++) 24 { 25 cin>>c[i]; 26 } 27 cin>>v; 28 if(v < 5) 29 { 30 cout<<v<<endl; 31 } 32 else 33 { 34 sort(c,c+n); 35 memset(f,0,sizeof(f));//记得初始化 老是忘记. 36 for(i=0;i<n-1;i++) 37 { 38 ZeroOnePack(v-5,c[i],c[i]); 39 } 40 cout<<v-f[v-5]-c[n-1]<<endl; 41 } 42 } 43 return 0; 44 }