01背包问题

有这样一个问题:有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30),每个物品有一个体积(正整数)。

要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。

问题分析:令d[i]表示在前i(1<=n<=n)个物品中能够装入最大容量的背包中物品的最大体积。可以得到下面的动态规划函数:

(1)v[i] = v[i-1] = 0;

(2)v[i] = max{v[i-vi],v[i-vi]+vi};

(1)式表明:如果第i件物品的体积大于背包的体积,则装入前i个物品的体积和前i-1个物品的体积是相同的,即物品i不能放入背包

(2)式表明:如果第i间物品的体积小于背包的体积,可分为两种情况:

a:把第i件物品装入背包,则背包的体积等于前i-1件物品的体积v[i-vi](vi为第i件物品的体积)加上第i件物品的体积;

b:没有把第i件物品装入背包,则背包的体积就等于前i-1件物品装入的体积

上述两种情况选择最大值即为最优解


#include<stdio.h>
#define max(a,b) a>b?a:b;


int main() {
int v,i,j,n;
int a[20001];
int d[20001];


memset(d,0,sizeof(d));

scanf("%d %d",&v,&n);
for(i=0; i<n; i++){
scanf("%d",&a[i]);
}

for(i=0; i<n; i++){
for(j=v; j>=a[i]; j--){
d[j] = max(d[j],d[j-a[i]]+a[i]);
if(d[j]==v){
printf("0");
return 0;
}
}
}
printf("%d",v-d[v]);//背包最后剩余的体积

return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值