题目描述
约翰遭受了重大的损失:蟑螂吃掉了他所有的干草,留下一群饥饿的牛.他乘着容量为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的位置存储了放置进去的物品的最大体积。