首页 > 代码库 > HDU 4341

HDU 4341

分组背包而已。注意的是,每个时间T,要把一组的全加进去比较一次。

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <vector>#define N 205#define T 41000using namespace std;int dp[T];struct node{	int x,y;	int t,v;}Node[N];struct zu{	int t,v;	zu(int tt,int vv){		t=tt; v=vv;	}};vector<zu>pts[N];bool cmp(node a,node b){	if(a.x*b.y-a.y*b.x>0)	return true;	else if(a.x*b.y-a.y*b.x==0){		if(a.x*a.x+a.y*a.y<b.x*b.x+b.y*b.y)		return true;	}	return false;}int main(){	int n,t,kase=0;	while(scanf("%d%d",&n,&t)!=EOF){		for(int i=0;i<n;i++){			scanf("%d%d%d%d",&Node[i].x,&Node[i].y,&Node[i].t,&Node[i].v);			pts[i].clear();		}		pts[n].clear();		sort(Node,Node+n,cmp);		int al=1;		pts[al].push_back(zu(Node[0].t,Node[0].v));		for(int i=1;i<n;i++){			if(Node[i].x*Node[i-1].y-Node[i].y*Node[i-1].x!=0)			al++;			pts[al].push_back(zu(Node[i].t,Node[i].v));		}		for(int i=1;i<=al;i++){			int size=pts[i].size();			for(int k=1;k<size;k++){				pts[i][k].t+=pts[i][k-1].t;				pts[i][k].v+=pts[i][k-1].v;			}		}		memset(dp,0,sizeof(dp));		for(int i=1;i<=al;i++){			int size=pts[i].size();			for(int p=t;p>=0;p--)			for(int k=0;k<size;k++){				if(p-pts[i][k].t<0) break;				dp[p]=max(dp[p],dp[p-pts[i][k].t]+pts[i][k].v);			}		}		printf("Case %d: %d\n",++kase,dp[t]);	}	return 0;}

  

HDU 4341