动态规划入门~背包问题~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的位置存储了放置进去的物品的最大体积。

猜你喜欢

转载自blog.csdn.net/fatfairyyy/article/details/113485092