HDU 3496(DP)

题目大意:

题意是 DuoDuo 想看n部电影,但是被要求最长能看的总时间数为 L ,每部电影有他的时长和DuoDuo对他的评价值 两个属性。 但是 商店有个奇怪的要求 一次只卖恰好 m 个电影碟 (m<=n) 在总时间内,为了获得最大的观赏总价值,要求得该总价值。

 

这个方程很好些吧。dp[i][j][k]表示前i个碟选了j个碟用了k的时间所获得的最大观赏价值

空间复杂度和时间复杂度都是N*M*L达到了10000000,空间复杂度可以用滚动数组降维,时间复杂度,10组的case如果都是极限数据可定tle

 

还好HDU比较仁慈,三维就可以过~

 

View Code
 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <cstring>
 4 #include <iostream>
 5 using namespace std;
 6 int n,m,l,tim[110],val[110],dp[2][110][1010],ans,tt;
 7 void read()
 8 {
 9     scanf("%d%d%d",&n,&m,&l);
10     for(int i=1;i<=n;i++) scanf("%d%d",&tim[i],&val[i]);
11 }
12 void go()
13 {
14     memset(dp,0x8f,sizeof dp);
15     dp[0][0][0]=0;
16     for(int i=1;i<=n;i++)//前i个物品 
17         for(int j=0;j<=min(i,m);j++)//选了j个 
18             for(int k=0;k<=l;k++)//花费时间k 
19             {
20                 dp[i&1][j][k]=dp[(i-1)&1][j][k];
21                 if(j-1>=0&&k-tim[i]>=0) dp[i&1][j][k]=max(dp[i&1][j][k],dp[(i-1)&1][j-1][k-tim[i]]+val[i]);
22             }
23     ans=0;
24     for(int i=0;i<=l;i++) ans=max(ans,dp[n&1][m][i]);
25     printf("%d\n",ans);
26 }
27 int main()
28 {
29     scanf("%d",&tt);
30     while(tt--)
31     {
32         read();
33         go();
34     }
35     system("pause");
36     return 0;
37 } 

 

 

posted @ 2012-08-29 22:41  proverbs  阅读(192)  评论(0编辑  收藏  举报