题目描述
有一个箱子容量为V(正整数,0 ≤ V ≤ 20000),同时有n个物品(0<n ≤ 30),每个物品有一个体积(正整数)。
要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。
输入描述:
1个整数,表示箱子容量
1个整数,表示有n个物品
接下来n行,分别表示这n个物品的各自体积
输出描述:
1个整数,表示箱子剩余空间。
输入
24
6
8
3
12
7
9
7
输出
0
思考
要将n个物品,每个物品带有体积装进容量为V的箱子里
回想01背包,选一些物品装进背包不超过背包体积,使得选的价值最大
这道题就是01背包的变形,就是选一些物品装进容量不超过V的箱子里,使得所选的总体积最大
那么箱子的剩余容量就是最小,把物品体积看成价值就行
代码
#include<iostream>
using namespace std;
const int N = 20010;
int f[N], v[N];
int n, m;
int main(){
cin>>m;
cin>>n;
for(int i = 1; i <= n; i++) cin>>v[i];
for(int i = 1; i <= n; i++){
for(int j = m; j >= v[i]; j--){
f[j] = max(f[j], f[j-v[i]] + v[i]);
}
}
cout<<m - f[m]<<endl;
return 0;
}