标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 145 Accepted Submission(s): 49
照例,先转一发官方题解:http://bestcoder.hdu.edu.cn/
1003 zhx and contest 状态压缩动态规划。i 表示当前已经做了的题的集合。f i 表示做完集合i中的所有题的最短用时。那么转移是相当简单的。但是也要注意判断状态是否合法时总分数可能会超过int范围。 另外有一种按l 排序后折半枚举的思路。但是这种思路是错的。因为很有可能做一道结束时间靠前的题会导致时间被卡,但是它又可以放到后面再做。就像背包不能贪心一样。
如官方发题解所说,不能按照l排序,这种贪心是错误的。
但是,可以按照 l-t 排序,即如果要选该题,那么浪费少的先选(如果不选,后面也不会选了),下面就是01背包了。
还是看不懂,为何n<=30也可以状压,不是应该妥妥 TLE+MLE的节奏吗? 难道是数据弱了? 等待大神博客ing
13130322 | 2015-03-15 10:11:17 | Accepted | 5188 | 202MS | 14184K | 1739 B | G++ | czy |
1 #include <cstdio> 2 #include <cstring> 3 #include <stack> 4 #include <vector> 5 #include <algorithm> 6 #include <queue> 7 #include <map> 8 #include <string> 9 10 #define ll long long 11 int const N = 32; 12 int const M = 100002; 13 int const inf = 1000000000; 14 ll const mod = 1000000007; 15 16 using namespace std; 17 18 int n,w; 19 int dp[N*M]; 20 int sum; 21 int sumt,mal; 22 int ma; 23 24 typedef struct 25 { 26 int t; 27 int v; 28 int l; 29 }PP; 30 31 PP p[N]; 32 33 bool cmp(PP a,PP b) 34 { 35 return a.l-a.t<b.l-b.t; 36 } 37 void ini() 38 { 39 int i; 40 sum=0;sumt=0;mal=0; 41 for(i=1;i<=n;i++){ 42 scanf("%d%d%d",&p[i].t,&p[i].v,&p[i].l); 43 sum+=p[i].v; 44 sumt+=p[i].t; 45 mal=max(mal,p[i].l); 46 } 47 ma=mal+sumt; 48 sort(p+1,p+1+n,cmp); 49 // for(i=1;i<=n;i++) printf(" i=%d t=%d v=%d l=%d\n",i,p[i].t,p[i].v,p[i].l); 50 } 51 52 void solve() 53 { 54 if(sum<w) return; 55 memset(dp,0,sizeof(dp)); 56 int i,j; 57 for(i=1;i<=n;i++){ 58 //printf(" i=%d l=%d\n",i,p[i].l); 59 for(j=ma;j>=0;j--){ 60 if(j>=p[i].l){ 61 if(j>=p[i].t) 62 dp[j]=max(dp[j],p[i].v+dp[ j-p[i].t ]); 63 } 64 else{ 65 //dp[j]=dp[i-1][j]; 66 } 67 //printf(" i=%d j=%d dp=%d\n",i,j,dp[j]); 68 } 69 } 70 } 71 72 void out() 73 { 74 if(sum<w){ 75 printf("zhx is naive!\n"); 76 } 77 else{ 78 int i; 79 for(i=0;;i++){ 80 if(dp[i]>=w){ 81 printf("%d\n",i);break; 82 } 83 } 84 } 85 } 86 87 int main() 88 { 89 //freopen("data.in","r",stdin); 90 //scanf("%d",&T); 91 //for(cnt=1;cnt<=T;cnt++) 92 while(scanf("%d%d",&n,&w)!=EOF) 93 { 94 ini(); 95 solve(); 96 out(); 97 } 98 }
hdu 5188 zhx and contest [ 排序 + 背包 ]
标签:
原文地址:http://www.cnblogs.com/njczy2010/p/4338863.html