2 solutions
-
2
本题和#A1272. 【例9.16】分组背包的题意和思路(看这里)一样,拿过来改改就能 AC
代码
#include <bits/stdc++.h> using namespace std; int a[1005],f[1005][1005],w[1005],v[1005]; int main(int argc, char **argv){ int m,n,t = 0; cin >> m >> n; for (int i = 1;i <= n;i++){ int p; cin >> w[i] >> v[i] >> p; t = max(t,p); f[p][++f[p][0]] = i; // f[p][0] 是存第 p 组有多少个物品 } for(int p = 1;p <= t;p++){ // 遍历组(拿出每组的最大价值) // 循环内外不能错!! for (int i = m;i > 0;i--){ // 遍历重量 for (int j = 1;j <= f[p][0];j++){ // 遍历本组的物品 if (i >= w[f[p][j]]) // 最大重量要够才能装下 a[i] = max(a[i - w[f[p][j]]] + v[f[p][j]],a[i]); } } } cout << a[m]; return 0; }
-
1
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <cmath> using namespace std; int n,m,a[1010],b[1010],c[110][1010],maxn; int f[1010]; int main() { scanf("%d%d",&m,&n); for (int i = 1; i <= n; i++) { int t; scanf("%d%d%d",&a[i],&b[i],&t); maxn = max(maxn,t); c[t][++c[t][0]] = i; } for (int i = 1; i <= maxn; i++) for (int j = m; j >= 0; j--) for (int k = 1; k <= c[i][0]; k++) if (j - a[c[i][k]] >= 0) f[j] = max(f[j],f[j - a[c[i][k]]] + b[c[i][k]]); printf("%d\n",f[m]); return 0; } ``` ```
- 1
Information
- ID
- 1033
- Time
- 1000ms
- Memory
- 128MiB
- Difficulty
- 6
- Tags
- # Submissions
- 30
- Accepted
- 11
- Uploaded By