标签:blog os io for 2014 amp log ios
这道题对q-p进行从小到大排序,举一个比较直观的例子:
4 20
5 15 20
8 12 19
2 16 21
9 11 13
按照q-p排序后每行dp的变化
0 0 0 0 0 0 0 0 0 0 0 13 13 13 13 13 13 13 13 13 13
0 0 0 0 0 0 0 0 0 0 0 13 19 19 19 19 19 19 19 32 32
0 0 0 0 0 0 0 0 0 0 0 13 19 19 19 20 33 39 39 39 39
0 0 0 0 0 0 0 0 0 0 0 13 19 19 19 20 40 41 54 60 60
没排序dp的变化
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20 20 20 20 20 20
0 0 0 0 0 0 0 0 0 0 0 0 19 19 19 20 20 20 20 20 20
0 0 0 0 0 0 0 0 0 0 0 0 19 19 19 20 40 41 41 41 41
0 0 0 0 0 0 0 0 0 0 0 13 19 19 19 20 40 41 41 41 41
可以明显看出没有排序忽略了8 12 19
5 15 20 是从dp[10]开始更新
8 12 19是从dp[4]开始更新
2 16 21是从dp[12]开始更新
9 11 13是从dp[3]开始更新
#include<iostream> #include<stdio.h> #include<algorithm> using namespace std; struct node{ int p,q,v; }a[505]; int dp[5005]; bool cmp(node a,node b){ return a.q-a.p<b.q-b.p; } int main(){ int n,m,p,q,v; while(cin>>n>>m){ for(int i=0;i<n;i++){ scanf("%d%d%d",&a[i].p,&a[i].q,&a[i].v); } for(int i=0;i<=m;i++) dp[i]=0; sort(a,a+n,cmp); for(int i=0;i<n;i++){ for(int j=m;j>=a[i].q;j--) dp[j]=max(dp[j-a[i].p]+a[i].v,dp[j]); } int ans=0; for(int i=0;i<=m;i++){ if(dp[i]>ans) ans=dp[i]; } cout<<ans<<endl; } }
hdu 3466 Proud Merchants,布布扣,bubuko.com
标签:blog os io for 2014 amp log ios
原文地址:http://blog.csdn.net/youngyangyang04/article/details/38316515