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 }

 

posted @ 2021-08-15 21:35  Rekord  阅读(74)  评论(0编辑  收藏  举报