TOJ 3290 Watch The Movie 二维01背包

女爷i 2022-05-17 07:04 177阅读 0赞

3290: Watch The Movie

描述

New semester is coming, and DuoDuo has to go to school tomorrow. She decides to have fun tonight and will be very busy after tonight. She like watch cartoon very much. So she wants her uncle to buy some movies and watch with her tonight. Her grandfather gave them L minutes to watch the cartoon. After that they have to go to sleep.
DuoDuo list N piece of movies from 1 to N. All of them are her favorite, and she wants her uncle buy for her. She give a value Vi (Vi > 0) of the N piece of movies. The higher value a movie gets shows that DuoDuo likes it more. Each movie has a time Ti to play over. If a movie DuoDuo choice to watch she won’t stop until it goes to end.
But there is a strange problem, the shop just sell M piece of movies (not less or more then), It is difficult for her uncle to make the decision. How to select M piece of movies from N piece of DVDs that DuoDuo want to get the highest value and the time they cost not more then L.
How clever you are! Please help DuoDuo’s uncle.

输入

The first line of the input file contains a single integer t (1 ≤ t ≤ 10), the number of test cases, followed by input data for each test case:
The first line is: N(N <= 100),M(M<=N),L(L <= 1000)
N: the number of DVD that DuoDuo want buy.
M: the number of DVD that the shop can sale.
L: the longest time that her grandfather allowed to watch.
The second line to N+1 line, each line contain two numbers. The first number is the time of the ith DVD, and the second number is the value of ith DVD that DuoDuo rated.

输出

Contain one number. (It is less then 2^31.)
The total value that DuoDuo can get tonight.
If DuoDuo can’t watch all of the movies that her uncle had bought for her, please output 0.

样例输入

1
3 2 10
11 100
1 2
9 1

样例输出

3

题意:多多想看电影,输入n部电影,可看m部电影,可看时常l,之后n行,输入每部电影的时间和价值,求得在时间限制下让价值最大。

思路:价值可能有负值,所以极值要设置为-INF。

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<math.h>
  4. #include<iostream>
  5. #include<string>
  6. #include<algorithm>
  7. #include<map>
  8. #include<set>
  9. #include<queue>
  10. #include<vector>
  11. using namespace std;
  12. #define inf 0x3f3f3f3f
  13. #define LL long long
  14. //二维01背包
  15. int dp[110][1005],t[110],v[110];
  16. int main()
  17. {
  18. int i,j,k,n,m,l,T;
  19. scanf("%d",&T);
  20. while(T--)
  21. {
  22. scanf("%d%d%d",&n,&m,&l);
  23. for(i=0;i<n;i++)
  24. scanf("%d%d",&t[i],&v[i]);
  25. for(i=0;i<=l;i++)
  26. dp[0][i]=0;
  27. for(i=1;i<=m;i++)
  28. {
  29. for(j=0;j<=l;j++)
  30. {
  31. dp[i][j]=-inf;//有可能为负值
  32. }
  33. }
  34. for(i=0;i<n;i++)
  35. {
  36. for(j=m;j>=1;j--)
  37. {
  38. for(k=l;k>=t[i];k--)
  39. dp[j][k]=max(dp[j][k],dp[j-1][k-t[i]]+v[i]);
  40. }
  41. }
  42. if(dp[m][l]<0)
  43. dp[m][l]=0;
  44. printf("%d\n",dp[m][l]);
  45. }
  46. }

发表评论

表情:
评论列表 (有 0 条评论,177人围观)

还没有评论,来说两句吧...

相关阅读

    相关 费用背包

    问题 二维费用的背包问题是指:对于每件物品,具有两种不同的费用;选择这件物品必须同时付出这两种代价;对于每种代价都有 一个可付出的最大值(背包容量)。问怎样选择物品可以得

    相关 01背包,完全背包

    01背包问题:一个背包总容量为V,现在有N个物品,第i个 物品体积为weight\[i\],价值为value\[i\],现在往背包里面装东西,怎么装能使背包的内物品价值最大?

    相关 01背包

    > 题目:有一个背包,体积为m,现在给你n个石头,每个石头都有价值和体积,问这个背包可以装下多大价值的石头。 > > 输入: > 第一行两个整数n,m,分别代表石头的个数

    相关 01背包

    01背包 > 且说上一周的故事里,小Hi和小Ho费劲心思终于拿到了茫茫多的奖券!而现在,终于到了小Ho领取奖励的时刻了! > > 小Ho现在手上有M张奖券,而奖品区有N