装箱问题
题意
做法
这道题是背包问题。
虽然最后输出的是剩余的容量,但是我们可以通过总容量减去最大容量得到。
\(01\) 背包只有两种情况,装或者不装。
Code
#include <bits/stdc++.h>
using namespace std;
int f[20010]; // dp数组
int w[40]; // 物品价值
int m, n;
int main() {
int i, j; // good stuff
cin >> m >> n;
for (i = 1; i <= n; ++i) cin >> w[i];
for (i = 1; i <= n; ++i)
for (j = m; j >= w[i]; j--)
if (f[j] < f[j - w[i]] + w[i]) // 空间 = 价值
f[j] = f[j - w[i]] + w[i]; // 相当最大值
cout << m - f[m];
return 0;
}
也可以像这样子
#include <bits/stdc++.h>
using namespace std;
int f[20010]; // dp数组
int w[40]; // 物品价值
int m, n;
int main() {
int i, j; // good stuff
cin >> m >> n;
for (i = 1; i <= n; ++i) cin >> w[i];
for (i = 1; i <= n; ++i)
for (j = m; j >= w[i]; j--)
f[j] = max(f[j], f[j-w[i]]+w[i];
cout << m - f[m];
return 0;
}
题外话
好久没更新题解了,七月肯定有时间连续发题解。

浙公网安备 33010602011771号