动态规划普及组练习
1018. 装箱问题 (NOIPpj2001)
(File IO): input:pack.in output:pack.out
时间限制: 1000 ms 空间限制: 262144 KB 具体限制
#include<bits/stdc++.h> using namespace std; int v,n,t[32]; int f[32][20002]; int main() { cin >> v >> n; int i,j; for(i = 1;i <= n;i++) cin >> t[i]; f[0][0] = 0; for(i = 1;i <= n;i++) for(j = 1;j <= v;j++) if(j >= t[i] && f[i - 1][j - t[i]] + t[i] >= f[i-1][j]) f[i][j] = f[i - 1][j - t[i]] + t[i]; else f[i][j] = f[i-1][j]; cout << v - f[n][v]; return 0; }
同类型题目:
https://www.luogu.org/problem/P1060 P1060 开心的金明
实现代码
#include<bits/stdc++.h> using namespace std; int n,m,v[27],p[27]; int f[27][30002]; int main() { cin >> n >> m; int i,j; for(i = 1;i <= m;i++) { cin >> v[i] >> p[i]; } for(i = 1;i <= m;i++) for(j = 1;j <= n; j++) { if(j >= v[i] && f[i-1][j-v[i]] + v[i]*p[i] > f[i-1][j]) { f[i][j] = f[i-1][j-v[i]] + v[i]*p[i] ; } else { f[i][j] = f[i - 1][j]; } } cout << f[m][n]; return 0; }
50分代码
#include<bits/stdc++.h> using namespace std; int n,m,v[62],p,q[62],w[62]; int f[62][32002]; int main() { cin >> n >> m; int i,j; for(i = 1;i <= m;i++) { cin >> v[i] >> p >> q[i]; w[i] = v[i] * p; } for(i = 1;i <= m;i++) { if(q[i]) { w[q[i]] += w[i]; v[q[i]] += v[i]; v[i] = 0; w[i] = 0; } } f[0][0] = 0; for(i = 1;i <= m;i++) for(j = 1;j <= n; j++) { if(j >= v[i] && f[i-1][j-v[i]] + w[i] > f[i-1][j]) f[i][j] = f[i-1][j-v[i]] + w[i]; else f[i][j] = f[i-1][j]; } cout << f[m][n]; return 0; }

浙公网安备 33010602011771号