zoukankan      html  css  js  c++  java
  • HDU-2159FATE(二维完全背包)

    FATE

    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
     
    二维完全背包
    这道题目有了对物品个数的限制,也相当于加了一维费用,直接加一维状态(其实现在感觉对二维的限制还有点一知半解)。
    中文题,意思很明确,用最小的忍耐度,获得刚好的经验值,再加一维对物品的限制。
    注意01背包(逆序),完全背包(顺序),多重背包,他们之间的循环顺序。
     1 #include <cstdio>
     2 #include <iostream>
     3 #include <cstring>
     4 #include <algorithm>
     5 using namespace std;
     6 
     7 const int max_size = 110;
     8 int val[max_size]; ///经验值
     9 int weg[max_size]; ///忍耐度
    10 int dp[max_size][max_size];
    11 
    12 int main()
    13 {
    14     int n1, m1, k1, s1;
    15     ///经验值,保留的忍耐度,怪的种数和最多的杀怪数
    16 
    17     while(scanf("%d %d %d %d", &n1, &m1, &k1, &s1) != EOF)
    18     {
    19         memset(dp, 0, sizeof(dp));
    20         for(int i = 0; i < k1; i++)
    21         {
    22             scanf("%d %d", val+i, weg+i);
    23         }
    24 
    25         int ans = 1000000;
    26         for(int i = 0; i < k1; i++)
    27         {
    28             for(int j = weg[i]; j <= m1; j++)
    29             {
    30                 for(int k = 1; k <= s1; k++)
    31                 {
    32                     dp[j][k] = max(dp[j][k], dp[j-weg[i]][k-1] + val[i]);
    33                     if(dp[j][k] >= n1 && ans >= j) ///找恰好满足条件的这个方法是对的,昨天和亮哥说,还以为错了呢。
    34                         ans = j;                    ///这里的j是用掉的忍耐度
    35                 }
    36             }
    37         }
    38         if(ans != 1000000)
    39         {
    40             printf("%d
    ", m1 - ans);
    41         }
    42         else
    43         {
    44             printf("-1
    ");
    45         }
    46     }
    47     return 0;
    48 }
    View Code
  • 相关阅读:
    leetcode 29-> Divide Two Integers without using multiplication, division and mod operator
    ros topic 发布一次可能会接收不到数据
    python中的print()、str()和repr()的区别
    python 部分函数
    uiautomatorviewer错误 unable toconnect to adb
    pyqt 不规则形状窗口显示
    appium 计算器demo
    Spring 3.0 注解注入详解
    Spring Autowire自动装配
    restful 学习地址
  • 原文地址:https://www.cnblogs.com/ya-cpp/p/4339541.html
Copyright © 2011-2022 走看看