1272:【例9.16】分组背包

分组背包

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 
 5 const int N=205;
 6 struct knapsack{
 7     int w,c,p;
 8 };
 9 knapsack ns[N];
10 int a[15][N],b[15][N],f[15][N];
11 int main(){
12     int m,n,t;
13     cin>>m>>n>>t;
14     for(int i=1;i<=n;i++)
15         cin>>ns[i].w>>ns[i].c>>ns[i].p;
16     //为每一组确定一个最优选择方案(一维数组)
17     for(int i=1;i<=m;i++){//column
18         for(int j=1;j<=n;j++){//row
19             if(i>=ns[j].w&&(ns[j].c>a[ns[j].p][i]||(ns[j].c==a[ns[j].p][i]&&ns[j].w<b[ns[j].p][i]))){
20                 a[ns[j].p][i]=ns[j].c;
21                 b[ns[j].p][i]=ns[j].w;
22             }
23         }
24     }
25     //联立所有组得到一个dp结果矩阵(二维数组) 
26     for(int i=1;i<=t;i++){
27         for(int j=1;j<=m;j++){
28             for(int k=0;k<=j;k++){
29                 f[i][j]=max(f[i][j],a[i][k]+f[i-1][j-b[i][k]]);
30             }
31         }
32     }
33     cout<<f[t][m]; 
34     return 0;
35 }

 

和下面这个“官方”题解比起来,感觉上面自己写的就是瞎猫撞到死耗子! ̄□ ̄||

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 
 5 int w[31],c[31];
 6 int a[11][32],f[201];
 7 int main(){
 8     int m,n,t;
 9     cin>>m>>n>>t;
10     for(int i=1;i<=n;i++){
11         int p;
12         cin>>w[i]>>c[i]>>p;
13         a[p][++a[p][0]]=i;//a[p][i]代表p组中第i个物品在输入的哪一行
14     }
15     for(int k=1;k<=t;k++)//group
16         for(int j=m;j>=0;j--)//weight
17             for(int i=1;i<=a[k][0];i++)//组中的每一项
18                 if(j>=w[a[k][i]])
19                     f[j]=max(f[j],f[j-w[a[k][i]]]+c[a[k][i]]);
20     cout<<f[m];
21     return 0;
22 }

 

posted @ 2021-08-16 11:58  Rekord  阅读(687)  评论(0编辑  收藏  举报