题目大意略,简化为完全背包DP,有n件物品,最大容量是m,每件物品有一个价值和容量,求可以获得的最大收益?
就不再分析了,dp[i]代表容量i的背包最大的收益
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#define max(a,b) a>b?a:b
#define maxn 106
using namespace std;
long long dp[100006]; //dp[i]代表容量i的背包最大的收益
struct pack{
int val; //幸福值
int w; //增加的卡路里
}food[maxn];
int main()
{
int n,m;
while(~scanf("%d",&n))
{
for(int i=0;i<n;i++)
scanf("%d%d",&food[i].val,&food[i].w);
scanf("%d",&m);
memset(dp,0,sizeof(dp));
for(int i=0;i<n;i++)
{
for(int j=food[i].w;j<=m;j++)
{
dp[j] = max(dp[j],dp[j-food[i].w]+food[i].val);
}
}
printf("%I64d\n",dp[m]);
}
system("pause");
return 0;
}