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\n");

26         else

27         printf("%d\n",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\n");

32         else

33         printf("%d\n",m-i);

34     }

35 }
View Code

 

你可能感兴趣的:(HDU)