• HDU 4341


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

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <vector>
    #define N 205
    #define T 41000
    
    using 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
    ",++kase,dp[t]);
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    数字三角形
    嵌套矩阵问题
    NKOJ1236 a^b
    历届试题 最大子阵
    【动态规划】最大连续子序列和,最大子矩阵和,最大m子段和
    历届试题 翻硬币
    历届试题 带分数
    用户模板和用户场景
    学习进度——第九周
    最大子数组——回调
  • 原文地址:https://www.cnblogs.com/jie-dcai/p/4148742.html
Copyright © 2020-2023  润新知