1268:【例9.12】完全背包问题
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 5 const int N=35; 6 struct knapsack{ 7 int w,v; 8 }; 9 knapsack ns[N]; 10 int cmp(knapsack x,knapsack y){ 11 return 1.0*x.v/x.w>1.0*y.v/y.w; 12 } 13 int main(){ 14 int m,n,ans=0; 15 cin>>m>>n; 16 for(int i=1;i<=n;i++)cin>>ns[i].w>>ns[i].v; 17 sort(ns+1,ns+n+1,cmp); 18 for(int i=1;i<=n;i++){ 19 int t=m/ns[i].w; 20 ans+=t*ns[i].v; 21 m%=ns[i].w; 22 } 23 cout<<"max="<<ans; 24 return 0; 25 }
使用贪心显然是不够全面和严谨的!
正确的求解:三层循环dp求解。
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 5 const int N=205; 6 int a[N],b[N],f[N][N]; 7 int main(){ 8 int m,n; 9 cin>>m>>n; 10 for(int i=1;i<=n;i++)cin>>a[i]>>b[i]; 11 for(int i=1;i<=n;i++) 12 for(int j=1;j<=m;j++){ 13 for(int k=j/a[i];k>=0;k--) 14 f[i][j]=max(f[i][j],b[i]*k+f[i-1][j-a[i]*k]); 15 } 16 cout<<"max="<<f[n][m]; 17 return 0; 18 }