问题简介
具体问题请参考
hihocoder的网站。
算法思想
这就是一个01-背包问题,非常典型的动态规划求解问题。按照物体逐一枚举,转换方程为max_value[money] = max(max_value[money] , max_value[money-need[物体]]+value[物体]),即在此之前所有物体中使用Money可以求得的最大value等于不采用最大值以及采用最大值中的最大值。
代码
#include <iostream>
using namespace std;
inline int mmax(int a,int b){
return (a>b)?a:b;
}
int main()
{
int need[502],value[502],N,M;
cin >> N >> M;
for (int i = 0;i < N;++i)
cin >> need[i] >> value[i];
int max_value[100002] = {0},j;
max_value[0] = 0;
for (int i = 0;i < N-1;++i){
for (j = M;j >= need[i];--j){
max_value[j] = mmax(max_value[j],max_value[j-need[i]]+value[i]);
}
}
cout << mmax(max_value[M],max_value[M-need[N-1]]+value[N-1]) << endl;
return 0;
}