Problem X
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 131072/65536K (Java/Other)
Total Submission(s) : 58 Accepted Submission(s) : 31
2 10 10 15 10 5 10 5 3 10 5 10 5 3 5 6 2 7 3
5 11
题意:首先给出物品数量和手中资金
人后每样物品给出价格,需要购买时手中至少需要多少资金,还有物品本身的价值
要求求出最大资金
思路:01背包,要注意的是要先按q-p排序
原本我是按其价值排序的,WA一次
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
struct node
{
int p,q,v;
} a[555];
int cmp(node x,node y)//按q-p排序,保证差额最小为最优
{
return x.q-x.p<y.q-y.p;
}
int main()
{
int n,m,i,j;
int dp[5555];
while(~scanf("%d%d",&n,&m))
{
for(i = 0; i<n; i++)
scanf("%d%d%d",&a[i].p,&a[i].q,&a[i].v);
memset(dp,0,sizeof(dp));
sort(a,a+n,cmp);
for(i = 0; i<n; i++)
{
for(j = m; j>=a[i].q; j--)//剩余的钱大于q才能买
{
dp[j] = max(dp[j],dp[j-a[i].p]+a[i].v);//这里的j-a[i].p决定了之前的排序方法
}
}
printf("%d\n",dp[m]);
}
return 0;
}