解题思路:典型的无限背包问题,dp表示当前背包容量下的最大幸福值,bo表示当前背包值是否可以被组成。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define N 105
#define M 100005
struct coor{
int value;
int ka;
}s[N];
int bo[M], dp[M];
int n, f;
int cmp(const coor &a, const coor &b){
return a.ka < b.ka;
}
int MAX(int a, int b){
return a>b?a:b;
}
int main(){
while (scanf("%d", &n) != EOF){
//Init.
memset(s, 0, sizeof(s));
memset(dp, 0, sizeof(dp));
memset(bo, 0, sizeof(bo));
// Read.
for (int i = 0; i < n; i++)
scanf("%d%d", &s[i].value, &s[i].ka);
scanf("%d", &f);
sort (s, s + n, cmp);
bo[0] = 1;
for (int i = 0; i < n; i++){
for (int j = 0; j <= f; j++){
if (bo[j] && s[i].ka + j <= f){
dp[s[i].ka + j] = MAX(dp[s[i].ka + j], s[i].value + dp[j]);
bo[s[i].ka + j] = 1;
}
}
}
int t = 0;
for (int i = 0; i <= f; i++)
if (t < dp[i])
t = dp[i];
printf("%d\n", t);
}
return 0;}