poj3624java_01背包问题:POJ3624

背包问题是动态规划中的经典问题,而01背包问题是最基本的背包问题,也是最需要深刻理解的,否则何谈复杂的背包问题。

POJ3624是一道纯粹的01背包问题,在此,加入新的要求:输出放入物品的方案。

我们的数组基于这样一种假设:

totalN表示物品的种类,totalW表示背包的容量

w[i]表示第i件物品的重量,d[i]表示第i件物品的价值。

F(i,j)表示前i件物品放入容量为j的背包中,背包内物品的最大价值。

F(i,j) = max{ F(i-1,j) , F(i-1,j-w[i])+d[i] }

我们仅考虑第i件物品到底放不放进背包

第一项表示不放入背包的情况。

第二项表示放入背包的情况。

然后,我们为了获得具体的方案,每当在局部最优的方案成立时,则将path[i][j]置为1,当求的最优结果后,从最终结果开始回溯,看看在第i轮的局部最优中是否放入物品i。

此时的代码如下所示:

#include #include#include#include

using namespacestd;#define max(a,b) a>b?a:b;

//数组要设的比给的范围稍大一些

int dp[3410][12900];int path[3410][12900];int w[3410];int d[3410];inttotalN;inttotalW;intmain()

{inti,j;

scanf("%d",&totalN);

scanf("%d",&totalW);for(i=

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值