洛谷 P1757 通天之分组背包

题目传送门

解题思路:

分组背包,代码有注释.

AC代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<set>
 4 
 5 using namespace std;
 6 
 7 int n,m,c[1001],w[1001],f[1001],z[1001],p[1001],s[1001][1001];
 8 
 9 int main() {
10     scanf("%d%d",&m,&n);
11     for(int i = 1;i <= n; i++) {
12         scanf("%d%d%d",&c[i],&w[i],&z[i]);
13         p[z[i]]++;
14         s[z[i]][p[z[i]]] = i;
15     }
16     f[0] = 0;
17     for(int o = 1;o <= n; o++)//组数 
18         for(int j = m;j >= 1; j--)//背包容量 
19             for(int i = p[o];i >= 1; i--) //当前组所有物品 
20                 if(j >= c[s[o][i]])
21                     f[j] = max(f[j],f[j-c[s[o][i]]] + w[s[o][i]]);
22     printf("%d",f[m]);
23     return 0;
24 } 

猜你喜欢

转载自www.cnblogs.com/lipeiyi520/p/11616856.html