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

来源:互联网 发布:软件开发计划书 编辑:程序博客网 时间:2024/05/02 00:04
问题描述
有一个箱子的容量为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

0 0
原创粉丝点击