标签:style class blog c code java
大概意思是给你2个数分别代表物品个数和你带的钱数,每个物品有3个值,p,q,v,分别表示买该物品所花的钱,买该物品最低所带的钱,物品的价值。得出最大的价值。
很明显是01背包。
则状态转移方程为:
for(i=0;i<n;i++)
for(j=m;j>=a[i].q;j--)
dp[j]=max(dp[j],dp[j-a[i].p]+a[i].w).
若保证动归方程无后效性,dp[j-a[i].p]一定要比dp[j]先算,j最小为a[i].q,所以需按q-p从小到大排序。
代码如下:
1 #include <stdio.h> 2 #include <string.h> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 7 struct mem{ 8 int p, q, w; 9 }a[550]; 10 11 bool cmp(mem a,mem b) 12 { 13 return a.q-a.p<b.q-b.p; 14 } 15 16 main() 17 { 18 int n, m, dp[5005], i, j, k; 19 while(scanf("%d%d",&n,&m)==2) 20 { 21 for(i=0;i<n;i++) 22 scanf("%d %d %d",&a[i].p,&a[i].q,&a[i].w); 23 sort(a,a+n,cmp); 24 memset(dp,-1,sizeof(dp)); 25 for(i=0;i<n;i++) 26 { 27 for(j=m;j>=a[i].q;j--) 28 dp[j]=max(dp[j],dp[j-a[i].p]+a[i].w); 29 } 30 printf("%d\n",dp[m]+1); 31 } 32 33 }
标签:style class blog c code java
原文地址:http://www.cnblogs.com/qq1012662902/p/3750003.html