您的位置:首页 > 其它

夕拾算法进阶篇:18)装箱问题 (01背包_动态规划DP)

2017-02-10 11:24 417 查看
问题描述

有一个箱子的容量为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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: