您的位置:首页 > 其它

HUD 5188(zhx and contest)有条件01背包

2015-08-07 14:06 211 查看
这题看到背包有个前提条件的,很快可以想到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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息