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
";
  }
}
原文地址:https://www.cnblogs.com/baccano-acmer/p/10251463.html