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
- hdu 1881 毕业bg
- hdu 1881 毕业bg
- HDU 1881 毕业bg
- HDU 1881 毕业bg
- hdu 1881 毕业bg
- hdu 1881 毕业bg- DP
- HDU - 1881 毕业bg(01背包)
- HDU-1881 毕业bg (01背包变形)
- 毕业bg
- hdu 1881 毕业bg (01背包变形)浙大计算机研究生复试上机考试-2008年
- hdu——1881——毕业bg 01背包问题
- HDOJ 题目1881 毕业bg(DFS)
- HDOJ 1881 毕业bg (01背包)
- hdoj 毕业bg 1881 (背包)
- hdoj--1881--毕业bg(dfs)
- 题目1030:毕业bg
- OJ_1030 毕业bg
- 题目1030:毕业bg
- 友元函数的深层探讨--在什么样的情况下需要友元
- 堆——heap
- day 03 jdk5.0新特性
- ListView 的原理与优化
- 我是新人
- HDU 1881 毕业bg
- 面试回顾
- C++编程中是不是线程越多越好?
- 这里主要针对Mapreduce的性能调优。
- YT新人之巅峰大决战04
- UITableView详解(UITableViewCell(一)重中之重)
- Pat(Advanced Level)Practice--1029(Median)
- typedef用法小结
- 别做HR最讨厌的求职者