HDU 2159 FATE【二维完全背包】

题意:xhd玩游戏,还需要n个经验值升级,还留有m的忍耐度,但是他最多打s只怪,给出k个怪的经验值a[i],以及消耗的忍耐度b[i],问xhd能不能升级--

因为有两个限定,忍耐度,和最多打s只怪(即没打一只怪,要消耗1),又因为每只怪有无数只,所以是二维的完全背包--

后来写了发现不对(过了样例一直WA)--又翻了题解发现是循环跳出没有弄对,要dp[i][j]>=n的同时且j==s(因为要刚好打s只怪--)

发现把每只怪的数量当1也能过(自己就是这样想的---55555)

每只怪只有一只水过版本--

 1 #include<iostream>  
 2 #include<cstdio>  
 3 #include<cstring>  
 4 #include<algorithm> 
 5 #define maxn 1005 
 6 using namespace std;
 7 int dp[maxn][maxn],a[maxn],b[maxn];
 8 int main()
 9 {
10     int i,j,k,n,m,s,t;
11     while(scanf("%d %d %d %d",&n,&m,&k,&s)!=EOF&&n&&m&&k&&s)
12     {
13         for(i=1;i<=k;i++) scanf("%d %d",&a[i],&b[i]);
14         memset(dp,0,sizeof(dp));
15         for(i=1;i<=m;i++)
16         {
17             for(j=1;j<=s;j++)
18             {
19                 for(t=1;t<=k;t++)
20                     if(i>=b[t]&&j>=1)
21                     dp[i][j]=max(dp[i][j],dp[i-b[t]][j-1]+a[t]);                                                
22             }
23             if(dp[i][s]>=n) break;
24         }
25         if(i>m) printf("-1
");
26         else
27         printf("%d
",m-i);
28     }
29 }
View Code

标准无数只怪版本--

 1 #include<iostream>  
 2 #include<cstdio>  
 3 #include<cstring>  
 4 #include<algorithm> 
 5 #define maxn 1005 
 6 using namespace std;
 7 int dp[maxn][maxn],a[maxn],b[maxn];
 8 int main()
 9 {
10     int i,j,k,n,m,s,t;
11     while(scanf("%d %d %d %d",&n,&m,&k,&s)!=EOF&&n&&m&&k&&s)
12     {
13         for(i=1;i<=k;i++) scanf("%d %d",&a[i],&b[i]);
14         memset(dp,0,sizeof(dp));
15         for(i=1;i<=m;i++)
16         {
17             for(j=1;j<=s;j++)
18             {
19                 for(t=1;t<=k;t++)
20                 {
21                     int h=1;
22                     while(i>=h*b[t]&&j>=h)
23                     {
24                     dp[i][j]=max(dp[i][j],dp[i-h*b[t]][j-h]+h*a[t]);
25                     h++;
26                     }
27                     }                                                
28             }
29             if(dp[i][s]>=n) break;
30         }
31         if(i>m) printf("-1
");
32         else
33         printf("%d
",m-i);
34     }
35 }
View Code
原文地址:https://www.cnblogs.com/wuyuewoniu/p/4291911.html