完全背包的化简,以及不同要求下的初始化

完全背包经历了两次化简。
1.从二维变一维。
2.从三层循环变两层循环。

二维三层循环:

/*
初始化
*/
for(int i=1;i<=n;i++) {
	for(int j=1;j<=K;j++) {
		for(int k=1;k<=j/w[i];k++){
			dp[i][j]=Math.min(dp[i-1][j-w[i]*k]+p[i]*k, dp[i][j]);
		}
	}
}

二维二层循环:

/*
初始化
*/
for(int i=1;i<=n;i++) {
	for(int j=w[i];j<=K;j++) {
		dp[i][j]=Math.min(dp[i][j-w[i]]+p[i], dp[i][j]);
	}
}

一维二层循环:

/*
初始化
*/
for(int i=1;i<=n;i++) {
	for(int j=w[i];j<=K;j++) {
		dp[j]=Math.min(dp[j-w[i]]+p[i], dp[j]);
	}
}

不懂的时候,请去动手画一画表格,就明白了。
在这里插入图片描述
在这里插入图片描述

关于初始化:

1.“恰好装满”求最小值:
dp[0] = 0;
dp[i] = INF; i∈[1,n];
因为在求dp[i]时,从dp[0]转移过来的意思是在容积为j的包里只装满第i种硬币时的价值。所以dp[0]是合法状态,不应初始化为INF

2.“ 不用恰好装满”求最小值:
dp[i] = INF; i∈[0,n];

3.恰好装满”求最大值:
dp[0] = 0;
dp[i] = -INF; i∈[1,n];

4.“不用恰好装满”求最大值:
dp[i] = 0; i∈[0,n];

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值