hdu 5188 zhx and contest [ 排序 + 背包 ]

传送门

zhx and contest

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 145    Accepted Submission(s): 49


Problem Description
As one of the most powerful brushes in the world, zhx usually takes part in all kinds of contests.
One day, zhx takes part in an contest. He found the contest very easy for him.
There are n problems in the contest. He knows that he can solve the ith problem in ti units of time and he can get vi points.
As he is too powerful, the administrator is watching him. If he finishes the ith problem before time li , he will be considered to cheat.
zhx doesn't really want to solve all these boring problems. He only wants to get no less than w points. You are supposed to tell him the minimal time he needs to spend while not being considered to cheat, or he is not able to get enough points.
Note that zhx can solve only one problem at the same time. And if he starts, he would keep working on it until it is solved. And then he submits his code in no time.
 

 

Input
Multiply test cases(less than 50 ). Seek EOF as the end of the file.
For each test, there are two integers n and w separated by a space. (1n30 , 0w109 )
Then come n lines which contain three integers ti,vi,li . (1ti,li105,1vi109 )
 

 

Output
For each test case, output a single line indicating the answer. If zhx is able to get enough points, output the minimal time it takes. Otherwise, output a single line saying "zhx is naive!" (Do not output quotation marks).
 

 

Sample Input
1 3 1 4 7 3 6 4 1 8 6 8 10 1 5 2 2 7 10 4 1 10 2 3
 

 

Sample Output
7 8 zhx is naive!
 

 

Source
 

 

Recommend
hujie   |   We have carefully selected several similar problems for you:  5189 5184 5181 5180 5177 

 

 

照例,先转一发官方题解:http://bestcoder.hdu.edu.cn/

 

1003 zhx and contest
状态压缩动态规划。

表示当前已经做了的题的集合。i  

表示做完集合i中的所有题的最短用时。那么转移是相当简单的。但是也要注意判断状态是否合法时总分数可能会超过int范围。
另外有一种按

排序后折半枚举的思路。但是这种思路是错的。因为很有可能做一道结束时间靠前的题会导致时间被卡,但是它又可以放到后面再做。就像背包不能贪心一样。


如官方发题解所说,不能按照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 }

 

posted on 2015-03-15 10:18  njczy2010  阅读(362)  评论(2编辑  收藏  举报