比较简单的完全背包问题;
题目大意为:小明有 X 元钱:有N种食物:P[ i ] 为 是食物的价钱 : V[ i ] 为 食物的美味度:
求 X 元钱 可以买到的最大美味度的食物:(一种食物可以被购买多次); 因为一开始忽略了这个条件 当成01 背包写的;
#include<bits/stdc++.h>
using namespace std;
//这是一个动态规划 的 完全背包问题
//dp[i][j]表示将前i件食物装进限制金钱为j的背包可以获得的最大美味度, 0 <= i <= n, 0 <= j <= x
//int dp[101][10001];
int P[101] = { 0 }; //金钱
int V[101] = { 0 }; //美味度
int F[10001];
int main() {
int N = 0;
scanf("%d", &N);
int count = 0;
while (N--) {
count++;
int n, x;
scanf("%d%d", &n, &x);
int tmp = n;
//memset(dp, 0, sizeof(dp));
memset(F, 0, sizeof(F));
for (int i = 1; i <= n; i++) {
scanf("%d%d", &P[i], &V[i]);
}
for (int i = 1; i <= n; i++) {
for (int j = P[i]; j <= x; j++) {
/*if (P[i] > j)
dp[i][j] = dp[i - 1][j];
else
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - P[i]] + V[i]);*/
F[j] = max(F[j], F[j - P[i]] + V[i]);
}
}
//printf("Case #%d: %d\n", count,dp[n][x]);
printf("Case #%d: %d\n", count, F[x]);
}
return 0;
}