HDU 1881 毕业bg

来源:互联网 发布:自己制作淘宝店铺横幅 编辑:程序博客网 时间:2024/06/11 01:07

题目链接~~>

做题感悟:这道题其实是 01 背包的变形,只是加了一个排序。

解题思路:先排序:如果不排序,就有可能结束完的时间在结束早的时间前面,这样的话结束完的时间就没法包含结束早的时间(没法更新)。把快乐度看作价值,把持续时间看作体积,不过每个物品的最大容量为结束时间(每个物品的容量不同)。既然是 01 背包那就可以用深搜来解决。

代码(01背包二维):

#include<stdio.h>#include<iostream>#include<map>#include<string>#include<string.h>#include<stdlib.h>#include<math.h>#include<vector>#include<queue>#include<algorithm>using namespace std ;#define  pret(a,b)  memset(a,b,sizeof(a))const int INF = 99999999 ;const int mod = 9997 ;const int MX= 55 ;int dp[MX][MX] ;struct node{    int w,v,c ;}T[MX] ;bool cmp(node a,node b){    return a.c < b.c ;}int max(int x,int y){    return x > y ? x : y ;}int main(){    int n ;    int v,c,w ;    while(~scanf("%d",&n)&&n>=0)    {        for(int i=1 ;i<=n ;i++)         scanf("%d%d%d",&T[i].w,&T[i].v,&T[i].c) ;        sort(T+1,T+n+1,cmp) ;// 以bg结束时间排序        int ans=0 ;        memset(dp,0,sizeof(dp)) ;        for(int i=1 ;i<=n ;i++)        {            v=T[i].v ;c=T[i].c ; w=T[i].w ;            for(int j=0 ;j<=c ;j++)            {                dp[i][j]=dp[i-1][j] ;                if(j>=v)                   dp[i][j]=max(dp[i][j],dp[i-1][j-v]+w) ;                ans=max(dp[i][j],ans) ; // 更新最大值            }        }        printf("%d\n",ans) ;    }    return 0 ;}

代码(01背包一维):

#include<stdio.h>#include<iostream>#include<map>#include<string>#include<string.h>#include<stdlib.h>#include<math.h>#include<vector>#include<queue>#include<algorithm>using namespace std ;#define  pret(a,b)  memset(a,b,sizeof(a))const int INF = 99999999 ;const int mod = 9997 ;const int MX= 1005 ;// 开大点int dp[MX] ;struct node{    int w,v,c ;}T[MX] ;bool cmp(node a,node b){    return a.c < b.c ;}int max(int x,int y){    return x > y ? x : y ;}int main(){    int n ;    int v,c,w ;    while(~scanf("%d",&n)&&n>=0)    {        for(int i=1 ;i<=n ;i++)         scanf("%d%d%d",&T[i].w,&T[i].v,&T[i].c) ;        sort(T+1,T+n+1,cmp) ;// 以bg结束时间排序        int ans=0 ;        memset(dp,0,sizeof(dp)) ;        for(int i=1 ;i<=n ;i++)        {            v=T[i].v ;c=T[i].c ; w=T[i].w ;            for(int j=c ;j>=v ;j--)            {                dp[j]=max(dp[j],dp[j-v]+w) ;                ans=max(dp[j],ans) ; // 更新最大值            }        }        printf("%d\n",ans) ;    }    return 0 ;}

 

0 0
原创粉丝点击