• 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
  • 相关阅读:
    mysql编码和Java编码相应一览表
    Swift开发之 使用系统的TabbarController
    Shiro Quartz之Junit測试Session管理
    爱加密Android APk 原理解析
    【机器学习基础】自适应提升
    select默认选择的实现方法
    怎样找对还有一半--第一章 品行与择偶关系
    一步步教你怎样自己主动部署博客
    HTML5的新特性
    DataTables Table plug-in for jQuery
  • 原文地址:https://www.cnblogs.com/wuyuewoniu/p/4291911.html
Copyright © 2020-2023  润新知