返回顶部

装箱问题

题意

题目

做法

这道题是背包问题。

虽然最后输出的是剩余的容量,但是我们可以通过总容量减去最大容量得到。

\(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;
}

题外话

好久没更新题解了,七月肯定有时间连续发题解。

posted @ 2022-07-21 13:16  zrc4889  阅读(30)  评论(0)    收藏  举报