zoukankan      html  css  js  c++  java
  • HDU2159(二维完全背包)

    FATE

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 11644    Accepted Submission(s): 5510


    Problem Description
    最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务。久而久之xhd开始对杀怪产生的厌恶感,但又不得不通过杀怪来升完这最后一级。现在的问题是,xhd升掉最后一级还需n的经验值,xhd还留有m的忍耐度,每杀一个怪xhd会得到相应的经验,并减掉相应的忍耐度。当忍耐度降到0或者0以下时,xhd就不会玩这游戏。xhd还说了他最多只杀s只怪。请问他能升掉这最后一级吗?
     
    Input
    输入数据有多组,对于每组数据第一行输入n,m,k,s(0 < n,m,k,s < 100)四个正整数。分别表示还需的经验值,保留的忍耐度,怪的种数和最多的杀怪数。接下来输入k行数据。每行数据输入两个正整数a,b(0 < a,b < 20);分别表示杀掉一只这种怪xhd会得到的经验值和会减掉的忍耐度。(每种怪都有无数个)
     
    Output
    输出升完这级还能保留的最大忍耐度,如果无法升完这级输出-1。
     
    Sample Input
    10 10 1 10
    1 1
    10 10 1 9
    1 1
    9 10 2 10
    1 1
    2 2
     
    Sample Output
    0
    -1
    1
    #include <iostream>
    #include <string.h>
    #include <algorithm>
    using namespace std;
    const int INF=0x3f3f3f3f;
    const int MAXN=1005;
    int w[MAXN],v[MAXN];
    int dp[MAXN][MAXN];
    int remain,patience,n,s;
    int main()
    {
        while(cin>>remain>>patience>>n>>s)
        {
            memset(dp,0,sizeof(dp));
            for(int i=0;i<n;i++)
            {
                cin>>v[i]>>w[i];
            }    
            for(int i=0;i<n;i++)
            {
                for(int j=w[i];j<=patience;j++)
                {
                    for(int z=1;z<=s;z++)
                    {
                        dp[j][z]=max(dp[j-w[i]][z-1]+v[i],dp[j][z]);
                    }
                }
            }
            int res=-1;
            for(int i=1;i<=patience;i++)
            {
                for(int j=1;j<=s;j++)
                {
                    if(dp[i][j]>=remain)//若所获得的经验值大于所需的经验值则更新 
                    {
                        res=max(patience-i,res); 
                    }
                }
            }
            cout<<res<<endl;
        }
        return 0;
    }

    简化版代码:

    #include <iostream>
    #include <algorithm>
    #include <string.h>
    using namespace std;
    const int MAXN=105;
    int remain,patience,n,s;
    int w[MAXN],v[MAXN];
    int dp[MAXN][2];//dp[i][0]:所获得经验的最大值.dp[i][1]:所选背包的总数
    int main()
    {
        while(cin>>remain>>patience>>n>>s)
        {
            memset(dp,0,sizeof(dp));
            for(int i=0;i<n;i++)
            {
                cin>>v[i]>>w[i];
            }
            
            for(int i=0;i<n;i++)
            {
                for(int j=w[i];j<=patience;j++)
                {
                    if(dp[j-w[i]][0]+v[i]>dp[j][0])
                    {
                        dp[j][0]=dp[j-w[i]][0]+v[i];
                        dp[j][1]=dp[j-w[i]][1]+1;
                    }
                }    
            }
            int res=-1;
            for(int i=0;i<=patience;i++)
            {
                if(dp[i][0]>=remain&&dp[i][1]<=s)
                {
                    res=i;
                    break;
                }
            }    
            if(res==-1)    cout<<res<<endl;
            else    cout<<patience-res<<endl;
            
        }
        return 0;
    }
  • 相关阅读:
    949. Largest Time for Given Digits
    450. Delete Node in a BST
    983. Minimum Cost For Tickets
    16. 3Sum Closest java solutions
    73. Set Matrix Zeroes java solutions
    347. Top K Frequent Elements java solutions
    215. Kth Largest Element in an Array java solutions
    75. Sort Colors java solutions
    38. Count and Say java solutions
    371. Sum of Two Integers java solutions
  • 原文地址:https://www.cnblogs.com/program-ccc/p/5643211.html
Copyright © 2011-2022 走看看