题意: 经典的完全背包问题,给出背包容量及物品体积,和 01 背包不同的是物品数量不限。
思路: 动态规划的问题可以先去想“如果得到了哪个子问题的答案,我就可以用它推出后面的问题”。试用到该经典问题上,如果我们知道了用 i 张奖券买这 N 个物品最多得到的喜好值为 best[i](i 从 0 到 j)。那么 best[j+1] 的值跟 best[j+1-need[0]]、best[j+1-need[1]]、best[j+1-need[2]]……有关系。可以写出状态转移式:
best[j]=max(best[j−need[i]]+value[i])
代码:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<stack>
#include<queue>
#include<utility>
#include<vector>
#include<cmath>
#include<set>
#include<map>
#include<iostream>
#include<algorithm>
#include<sstream>
using namespace std;
typedef long long LL;
int N, M;
int need[510], value[510];
int best[100010];
int main()
{
while(scanf("%d%d", &N, &M) == 2){
for(int i=0; i<N; i++){
scanf("%d%d", &need[i], &value[i]);
}
for(int i=0; i<=M; i++){
int tmp = 0;
for(int j=0; j<N; j++){
if(i < need[j]) continue;
tmp = max(tmp, best[i-need[j]]+value[j]);
}
best[i] = tmp;
}
printf("%d\n", best[M]);
}
return 0;
}