题目描述
思路
和背包有点像,但是他没有“显式”的说出价值,其实让求剩余空间最小,就是箱子体积最大,可以转换为求价值最大,即体积就是价值
代码
把上一篇题解的 洛谷 采药问题代码一改就ok
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e6+10;
int f[N];
int t[N],w[N];
//01背包
signed main()
{
int v, n;
cin >> v>>n;
for(int i = 1; i <= n; i++)
{
cin>>t[i];
w[i] = t[i];
}
for(int i = 1; i <= n; i++)
{
for(int j = v; j >= t[i]; j--)//01背包是逆序
//这里省去判断的时机,这个物品的价值首先要小于总体积,还要大于这个物品的体积(进行转移)
{
f[j] = max(f[j], f[j - t[i]]+w[i]);
}
}
cout<<v-f[v]<<endl;//背包容量最大时
return 0;
}
总结
关键是要能看出来是个背包问题