写博客主要是记录 做的这些动态规划都是基础题,主要是为了熟悉如何思考动态规划类型的题目,遇到简单题能有头绪,遇到难题能找到思考点
本题和01背包类似,也是物品装或者不装,但本题要求的是最小容量,这就又说明了细节点会与01背包有所不同
以下是代码
#include<bits/stdc++.h>
#define endl '\n'
#define int int64_t
using namespace std;
int n, v, w[35], f[20005];
signed main() {
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
cin >> v >> n;
for (int i = 1; i <= n; ++i) cin >> w[i];
for (int i = 1; i <= n; ++i) {
for (int j = v; j >= 1; --j) {
//加了以后,剩余容量能减少就放
if (j >= w[i] && f[j - w[i]] + w[i] <= j) {
//可以放
f[j] = max(f[j]/*不放*/, f[j - w[i]] + w[i]/*放*/);
}
}
}
/*for (int j = 1; j <= v; ++j) {
cout << f[j] << " ";
}*/
cout << v - f[v] << endl;
return 0;
}
值得一提的是,这题和一道送礼物的题很像,但那题是没法用动态规划做的,这个动态规划本质上是穷举,用空间换时间,如果这道题的最大容量是10^9,这就导致压根开不出这么大的数组,也压根没法遍历这么大的数组,就要用到搜索,而且是双向搜索(但我不会写T_T) <--- 那你写这段话干啥? <-- 装一波不行吗?^_^