随笔-65  评论-6  文章-0  trackbacks-0
 1 /*
 2 Author:    Leo.W
 3 Descriptipn:    一个二维背包的问题,给定升级上限经验n,在忍耐力和杀怪数上限为m与s的情况下,
 4                 面对所列的k种怪物,每种所获经验a[],消耗忍耐b[]。在能升级的情况下保留的最多
 5                 忍耐值。不能升级则输出-1.
 6 How to Do:    加一维消耗,作完全背包,每种怪的数量是无限的。
 7   */
 8 #include <stdio.h>
 9 #include <iostream>
10 #include <string.h>
11 using namespace std;
12 #define MAXSIZE 102
13 int DP[MAXSIZE][MAXSIZE];
14 int a[MAXSIZE];
15 int b[MAXSIZE];
16 int main(){
17     //freopen("in.txt","r",stdin);
18     int N,M,K,S;
19     while (scanf("%d%d%d%d",&N,&M,&K,&S)!=EOF){
20         int i,j,k;
21         for(i=0;i<K;i++)    scanf("%d%d",&a[i],&b[i]);
22         memset(DP,0,sizeof(DP));
23         for(i=1;i<=M;i++){
24             for(j=1;j<=S;j++){
25                 for(k=0;k<K;k++){
26                     if(i-b[k]>=0){
27                         if (DP[i-b[k]][j-1]+a[k]>DP[i][j])    
28                             DP[i][j]=DP[i-b[k]][j-1]+a[k];    
29                     }
30                 }
31             }
32             if (DP[i][S]>=N)//当满足升级 即跳出
33                 break;
34         }
35         if(i>M)    printf("-1\n");
36         else printf("%d\n",M-i);
37     }
38 
39     return 0;
40 } 
41 
posted on 2012-03-12 22:45 Leo.W 阅读(147) 评论(0)  编辑 收藏 引用

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