【题目描述】
有一个箱子容量为VV(正整数,0≤V≤200000≤V≤20000),同时有n个物品(0≤n≤300≤n≤30),每个物品有一个体积(正整数)。要求从nn个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。
【输入】
第一行是箱子的容量,第二行是nn(表示nn有nn个物品),接下来nn行是nn个物品的体积。
【输出】
最小空间
【输入样例】
24
6
8
3
12
7
9
7
【输出样例】
0
题目思路:这道题本身就是简单的01背包问题,想学习基础01背包,可以去看这篇博客
但是很多人会疑惑,它为什么没有价值,其实,这里的数值,即使质量也是价值,可得状态转移方程:
d[j]=max(d[j],d[j-w[i]]+w[i]);
全代码
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int n,v,d[100010],w[10010];
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>=0;j--)
{
if(j>=w[i])
{
d[j]=max(d[j],d[j-w[i]]+w[i]);
}
}
}
cout<<v-d[v];//因为题目求的是最小,我们就用总重量减去最大质量
return 0;
}
可以去信息学奥赛一本通1917进行测试