这题看到背包有个前提条件的,很快可以想到HDU3466 Proud Merchants,也是有前提条件的
li-ti是最早开始的时间,我们尽量从时间早的开始选,即li-ti从小到大排序。
还有这种要满足某某要求时所需某某最少的,基本都是先算每个状态所能达到的最大值,然后从前往后扫描第一次达到所求值时,这个状态就是所要求的最小。
代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<stdlib.h>
using namespace std;
typedef struct node
{
int t,v,l;
}G;
G pr[50];
int n,w;
int dp[3000010];
int cmp(const G &a,const G &b)
{
if((a.l-a.t)!=(b.l-b.t)) return a.l-a.t<b.l-b.t;
else if(a.l!=b.l) return a.l<b.l;
else return a.v>b.v;
}
int Max(int a,int b)
{
return a>b?a:b;
}
int main()
{
int i,j,k;
int maxt,maxs;
while(scanf("%d%d",&n,&w)!=EOF)
{
maxt=0;
for(i=0;i<n;i++)
{
scanf("%d%d%d",&pr[i].t,&pr[i].v,&pr[i].l);
maxt+=Max(pr[i].t,pr[i].l);
}
sort(pr,pr+n,cmp);
/* for(i=0;i<n;i++)
printf("%d %d %d\n",pr[i].t,pr[i].v,pr[i].l);
*/
memset(dp,0,sizeof(dp));
for(i=0;i<n;i++)
{
maxs=Max(pr[i].l,pr[i].t);
for(j=maxt;j>=maxs;j--)
{
dp[j]=Max(dp[j-pr[i].t]+pr[i].v,dp[j]);
}
}
for(i=0;i<=maxt;i++)
{
if(dp[i]>=w) break;
}
if(i>maxt) printf("zhx is naive!\n");
else printf("%d\n",i);
}
return 0;
}