动态规划:背包问题的常见几种用法

1.0-1背包

1.1求最大价值

一般递推公式:

//先根据题意初始化
for(int i=1;i<w.size();++i)
	for(int j=m;j>=w[i];--j)
		dp[j]=max(dp[j],dp[j-w[i]]+v[i]);

注意:这里采用滚动数组的方法,所以背包重量的遍历从后往前
对应题目:力扣1049最后一块石头重量:https://leetcode-cn.com/problems/last-stone-weight-ii/

1.2求达到某价值有效的方法数量

这种题目一般物品价值和重量是相同的。

//初始化,一般令dp[0]=1;
for(int i=0;i<nums.size();++i)
	for(int j=m;j>=w[i];--j)
		dp[j]+=dp[j-nums[i]];

这里指的是方法的数量
对应题目:力扣494目标和:https://leetcode-cn.com/problems/target-sum/

2.完全背包

2.1顺序无关的方法数量(组合问题)

物品可以无限选取,与1.2类似,只是背包重量的遍历从前往后

//初始化,一般令dp[0]=1;
for(int i=0;i<nums.size();++i)
	for(int j=w[i];j<=m;++j)
		dp[j]+=dp[j-nums[i]];

对应题目:力扣518零钱兑换II:https://leetcode-cn.com/problems/coin-change-2//

2.2顺序有关的方法数量(排列问题)

物品可以无限选取,且方法的顺序不同可视为不同方法
与2.1类似,只不过外部进行背包重量遍历,内循环遍历物品价值。

//初始化,一般令dp[0]=1;
for(int j=1;j<=m;++j)
	for(int i=0;i<nums.size();++i)
		if (j>=nums[i])
			dp[j]+=dp[j-nums[i]];

对应题目:力扣377:组合总和IV:https://leetcode-cn.com/problems/combination-sum-iv/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值