随笔-65  评论-6  文章-0  trackbacks-0
 1 /*
 2 Author:    Leo.W
 3 Descriptipn:    在限定购买量M,观看时间L的情况下,在提供的N件电影中挑选出价值最大的。
 4 How to Do:    二维费用背包问题。dp[j][k]=max{dp[j][k],dp[j-c[i]][k-1]+w[i]};
 5   */
 6 #include <iostream>
 7 #include <string.h>
 8 #include <algorithm>
 9 using namespace std;
10 //#define max(a,b) (a)>(b)?(a):(b)
11 int c[101],w[101];
12 int dp[101][1001];
13 int main(){
14     //freopen("in.txt","r",stdin);
15     int t;
16     scanf("%d",&t);
17     while (t--){
18         int n,m,l;
19         scanf("%d%d%d",&n,&m,&l);
20         int i,j,k;
21         for (i=0;i<n;i++)    scanf("%d%d",&c[i],&w[i]);
22         memset(dp,-1,sizeof(dp));//因为有一维要装满,即初始化时不能为零
23         dp[0][0]=0;
24         for (i=0;i<n;i++){
25             for (k=m;k>0;k--){
26                 for (j=l;j>=c[i];j--){//需要判断是不是从零累积的到
27                     if(dp[k-1][j-c[i]]!=-1&&dp[k][j]<dp[k-1][j-c[i]]+w[i])
28                         dp[k][j]=dp[k-1][j-c[i]]+w[i];
29                 }
30             }
31         }
32         int ms=0;//此处初始很重要 考虑特殊情况为零值
33         for(i=l;i>=0;i--)
34             if(dp[m][i]>ms)
35                 ms=dp[m][i];
36         printf("%d\n",ms);
37     }
38     return 0;
39 }
40 
posted on 2012-03-14 12:49 Leo.W 阅读(220) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理