zoukankan      html  css  js  c++  java
  • HDU 2159 FATE(有选择物品总个数限制的完全背包,经典!!)

    FATE
    Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u
    Submit Status

    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<stdio.h>
    #include<iostream>
    #include<math.h>
    #include<string.h>
    #include<set>
    #include<map>
    #include<list>
    #include<algorithm>
    using namespace std;
    typedef long long LL;
    int mon1[13]= {0,31,28,31,30,31,30,31,31,30,31,30,31};
    int mon2[13]= {0,31,29,31,30,31,30,31,31,30,31,30,31};
    int dir[4][2]= {{0,1},{0,-1},{1,0},{-1,0}};
    
    #define max_v 105
    int v[max_v];
    int w[max_v];
    int dp[max_v][max_v];//忍耐度为i下,杀j只怪得到的最大经验值
    int main()
    {
        int n,m,K,s;//需要的经验值,忍耐度,怪物种数和最大杀怪数
        while(~scanf("%d %d %d %d",&n,&m,&K,&s))
        {
            for(int i=0;i<K;i++)
                scanf("%d %d",&v[i],&w[i]);
            memset(dp,0,sizeof(dp));
    
            int flag=0;
            /*
            在忍耐度剩余i的情况下,有k种怪物可以杀,杀j只可以得到的最大经验数
            */
            for(int i=1;i<=m;i++)//忍耐度剩余i的情况下
            {
                for(int k=0;k<K;k++)//第k种怪物
                {
                    for(int j=1;j<=s;j++)//杀j只
                    {
                        if(w[k]<=i)//要求该怪物的忍耐度小于或者等于剩余的忍耐度,才可以杀
                        {
                            dp[i][j]=max(dp[i][j],dp[i-w[k]][j-1]+v[k]);
                        }
                    }
                }
                if(dp[i][s]>=n)//是否存在剩余忍耐度为i,杀怪数为s的情况下的最大经验值大于等于n
                {
                    printf("%d
    ",m-i);
                    flag=1;
                    break;
                }
            }
            if(flag==0)
                printf("-1
    ");
        }
        return 0;
    }
  • 相关阅读:
    209. Minimum Size Subarray Sum
    208. Implement Trie (Prefix Tree)
    207. Course Schedule
    206. Reverse Linked List
    205. Isomorphic Strings
    204. Count Primes
    203. Remove Linked List Elements
    201. Bitwise AND of Numbers Range
    199. Binary Tree Right Side View
    ArcGIS API for JavaScript 4.2学习笔记[8] 2D与3D视图同步
  • 原文地址:https://www.cnblogs.com/yinbiao/p/9808806.html
Copyright © 2011-2022 走看看