zoukankan      html  css  js  c++  java
  • FATE HDU

    解法

    完全背包但是又有别的条件(忍耐值为体力经验是价值)

    ①首先杀怪是有上限s的,所以需要记录杀怪的数量并且if时候还需要加上条件

    ②最后还得遍历一下从小到大遍历当前dp范围内是不是已经有够经验的那么就可以直接输出忍耐值的差

    ③最后如果没有经验达到的话那么输出-1

    ④一定得注意dp更新的时候的条件

    代码

    #include <bits/stdc++.h>
    using namespace std;
    int w[1000],v[1000],dp[100000],num[100000];
    int main()
    {
      ios::sync_with_stdio(0);
      cin.tie(0);
      cout.tie(0);
      int n,m,k,s;
      while(cin>>n>>m>>k>>s)
      {
        int f=0;
        memset(dp,0,sizeof(dp));
        for(int i=0;i<k;i++)
        cin>>w[i]>>v[i];
        for(int i=0;i<k;i++)
        for(int j=v[i];j<=m;j++)
        if(num[j-v[i]]+1<=s&&dp[j]<dp[j-v[i]]+w[i])
        {
          dp[j]=dp[j-v[i]]+w[i];
          num[j]=num[j-v[i]]+1;
        }
        for(int i=0;i<=m;i++)
        if(dp[i]>=n)
        {
          cout<<m-i<<"
    ";
          f=1;
          break;
        }
        if(!f)
        cout<<"-1
    ";
      }
    }
    
  • 相关阅读:
    36、【opencv入门】运动物体检测(2)
    二叉树数
    多边形的三角划分
    乘积最大
    加分二叉树
    c++ 装箱问题
    生物基元问题
    一般性的最少硬币组成问题
    打包
    挤牛奶
  • 原文地址:https://www.cnblogs.com/baccano-acmer/p/10251463.html
Copyright © 2011-2022 走看看