3024
Problem X
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 131072/65536K (Java/Other)
Total Submission(s) : 24 Accepted Submission(s) : 16
2 10 10 15 10 5 10 5 3 10 5 10 5 3 5 6 2 7 3
5 11
思路:0-1背包问题;M元钱可以类比成书包拍的总容量。在容量固定的情况下考虑价值;
对于每件商品只有两种情况,买或者不买;
买了第N件商品:f(n,m)=f(n-1,m-pn)+v[n];减小了问题的规模
没买第N件商品:f(n,m)=f(n-1,m);
按q-p由小到大排序,然后就可以不再考虑顺序问题了;
AC代码:
#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;
}