问题描述
有一个箱子的容量为V(V为正整数,且满足0≤V≤20000),同时有n件物品(体积值为正整数)要求从n件物品中,选取若干装入箱内,使箱子的剩余空间最小。
题目来源: http://www.codeup.cn/problem.php?cid=100000631&pid=0
有一个箱子的容量为V(V为正整数,且满足0≤V≤20000),同时有n件物品(体积值为正整数)要求从n件物品中,选取若干装入箱内,使箱子的剩余空间最小。
输入
1行整数,第1个数表示箱子的容量,第2个数表示有n件物品,后面n个数分别表示这n件 物品各自的体积。
输出
1个整数,表示箱子剩余空间。
输入样例24 6 8 3 12 7 9 7
输出样例0
这个题应该是01背包的简单应用,但注意这里没有明确给出物品的价值。题目要求使箱子的剩余空间最小,也就是说使是放入物品的总体积最大。物品的体积在此等价于物品的价值。因此其状态转移方程如下:
dp[i][v]=max{dp[i-1][v],dp[i-1][v-w[i]]+w[i]} (1=<i<=n,w[i]<=v<=V)
在代码中,使用一维的形式如下:
#include<iostream>
#include<algorithm>
using namespace std;
const int M=20002;
int dp[M];
int main(){
int m,n,i,v,w;
cin>>m>>n;
for(i=0;i<n;i++){
cin>>w;
for(v=m;v>=w;v--){
dp[v]=max(dp[v],dp[v-w]+w);
}
}
cout<<m-dp[m]<<endl;
}
题目来源: http://www.codeup.cn/problem.php?cid=100000631&pid=0