动态规划入门~背包问题~2021.1.31

题目描述

约翰遭受了重大的损失:蟑螂吃掉了他所有的干草,留下一群饥饿的牛.他乘着容量为C(1≤C≤50000)个单位的马车,去顿因家买一些干草. 顿因有H(1≤H≤5000)包干草,每一包都有它的体积Vi(l≤Vi≤C).约翰只能整包购买,

他最多可以运回多少体积的干草呢?

输入输出样例

在这里插入图片描述

AC代码

#include <iostream>
using namespace std;
const int maxn = 50005;
const int Lim = 5005;
int a[Lim] = {0},f[maxn] = {0};
int main()
{
	int c,h;
	cin>>c>>h;
	for(int i=1;i<=h;i++){
		cin>>a[i];
	}
	for(int i=1;i<=h;i++){
		for(int j=c;j>=a[i];j--){
			f[j] = max(f[j],f[j-a[i]]+a[i]);
		}
		if(f[c] == c){
			break;
		}
	}
	cout<<f[c];
	return 0;
}

解释

①背包问题的模板题,核心代码如下:

for(int i=1;i<=h;i++){//枚举每一件物品
	for(int j=c;j>=a[i];j--){//枚举背包的每一块位置
		f[j] = max(f[j],f[j-a[i]]+a[i]);//如果能放下物品,则放置物品并增加体积
		//注意dp的思想
	}
}

②特判:当物品总体积和背包体积相等时,直接退出循环。

if(f[c] == c){
	break;
}

③输出:输出的是背包体积的位置,因为背包体积c的位置存储了放置进去的物品的最大体积。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
对于背包问题,有两种常用的算法实现:动态规划法和贪心法。 1. 动态规划法: 动态规划法是一种基于状态转移的算法思想,用于解决具有重叠子问题性质的问题。在背包问题中,动态规划法的基本思路是通过构建一个二维数组来记录每个子问题的最优解,并不断更新数组中的值。 具体实现步骤如下: - 创建一个二维数组dp,其中dp[i][j]表示在前i个物品中能够装入容量为j的背包的最大价值。 - 初始化dp数组的第一行和第一列为0,表示背包容量为0或物品数量为0时的最大价值都为0。 - 遍历物品列表,对于每个物品i,遍历背包容量j,根据以下情况更新dp数组的值: - 如果当前物品i的重量大于背包容量j,则无法将该物品放入背包,dp[i][j] = dp[i-1][j]; - 如果当前物品i的重量小于等于背包容量j,则可以选择将该物品放入背包或不放入背包。分别计算两种情况下的最大价值,并取较大值更新dp[i][j],即dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i]),其中w[i]表示物品i的重量,v[i]表示物品i的价值。 - 最终,dp[n][C]即为问题的最优解,其中n为物品数量,C为背包容量。 2. 贪心法: 贪心法是一种基于局部最优选择的算法思想,每次选择当前状态下的最优解,并希望通过每一步的最优选择来达到全局最优解。在背包问题中,贪心法的基本思路是根据物品的单位重量价值(即每个物品的价值与重量之比)进行排序,然后依次选择单位重量价值最高的物品放入背包。 具体实现步骤如下: - 计算每个物品的单位重量价值,并按照单位重量价值进行降序排序。 - 初始化背包容量C和总价值value为0。 - 遍历排序后的物品列表,对于每个物品i: - 如果物品i的重量小于等于背包剩余容量C,则将物品i放入背包,并更新背包剩余容量C和总价值value。 - 否则,将物品i的一部分放入背包,以使得背包恰好装满,并更新背包剩余容量C和总价值value。 - 最终,value即为问题的最优解。 需要注意的是,贪心法并不能保证得到问题的最优解,但对于某些特定情况下的背包问题,贪心法可能会得到与动态规划法相近的结果,并且具有更高的效率。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值