您的位置:首页 > 其它

【动态规划】简单背包问题II

2016-08-15 18:23 169 查看

问题B:【动态规划】简单背包问题II

时间限制:1Sec内存限制:64MB
提交:21解决:14
[提交][状态][讨论版]

题目描述

张琪曼:“为什么背包一定要完全装满呢?尽可能多装不就行了吗?”

李旭琳:“你说得对,这和墨老师曾告诉我们的‘日中则昃,月满则亏’是一个道理。”所以,现在的问题是,她们有一个背包容量为v(正整数,0≤v≤20000),同时有n个魔法石(0≤n≤30),每个魔法石有一个体积(正整数)。要求从n个魔法石中,任取若干个装入包内,使背包的剩余空间为最小。

输入

第一行为一个整数,表示背包容量,第二行为一个整数,表示有n个魔法石,接下来n行,分别表示这n个魔法石的各自体积。

输出

只有一个整数,表示背包剩余空间。

样例输入

24
6
8
3
12
7
9
7

样例输出

0
代码:


#include<cstdio>
#include<iostream>
#include<cstring>

usingnamespacestd;

intdp[35][20005];

intmain(){
intT;
intM;
intt[20005];
intp[20005];
while(scanf("%d%d",&T,&M)!=EOF){
for(inti=0;i<=M;i++){
for(intj=0;j<=T;j++){
dp[i][j]=0;
}
}
dp[0][0]=0;
for(inti=1;i<=M;i++){
scanf("%d",&t[i]);
}
for(inti=1;i<=M;i++){
for(intj=1;j<=T;j++){
if(j>=t[i]){
dp[i][j]=max(dp[i-1][j],dp[i-1][j-t[i]]+t[i]);
}else{
dp[i][j]=dp[i-1][j];
}
}
}

printf("%d\n",T-dp[M][T]);
}
return0;
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: