题目传送门
思路
很明显的01背包
dp数组含义
dp[i]]表示花i元钱可以获得的干草垛最大值
状态转移方程
普通的01背包状态转移方程为
但是本题的w和v是一个数组,所以本题的状态转移方程为
推到顺序
for(1->h){
for(c->w[i]){
}
}
初始化
花0块钱的答案是0,所以dp[0]=0,所以不需要初始化。
输出
最终的答案应该为花c元的,所以输出 dp[c]
代码:
#include<bits/stdc++.h>
#define endl '\n';
using namespace std;
long long c,h,w[51000],dp[51000];
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>c>>h;
for(int i=1;i<=h;i++)cin>>w[i];
for(int i=1;i<=h;i++){
for(int j=c;j>=w[i];j--){
dp[j]=max(dp[j],dp[j-w[i]]+w[i]);
}
}cout<<dp[c];
return 0;
}