#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int M =110; // 决策 :第i种不选 第i种至少选一只
int vol[M],val[M],dp[M][M]; // dp[i][j][k] 前i种怪兽选j只忍耐度不大于 k的最大价值 =max(dp[i-1][j][k],dp[i][j-1][k-vol[i]]+val[i])
int main()
{
int n,m,k,s;
while(cin>>n>>m>>k>>s)//(需的经验值)n (保留的忍耐度)m (怪的种数)k (最多的杀怪数)s
{
for(int i=1;i<=k;i++)
{
cin>>val[i]>>vol[i];
}
memset(dp,0,sizeof(dp)); //前0种 价值0 (没要求装满某个约束条件)
for(int i=1;i<=k;i++) // 优化到二维 : dp[j][p] 前i种选 j只忍耐度为p的最大价值
{
for(int j=1;j<=s;j++)
{
for(int p=1;p<=m;p++) //顺推 保证:dp[j-1][p-vol[i]] 来自前i种
{
if(p>=vol[i])
{
dp[j][p]=max(dp[j][p],dp[j-1][p-vol[i]]+val[i]);
}
}
}
}
if(dp[s][m]<n) cout<<-1<<endl;
else //找到前i种 选j只忍耐度为p时获得的最大经验值>=n中的最小p
{
int Min =m;
for(int j=1;j<=s;j++)
{
for(int p=1;p<=m;p++)
{
if(dp[j][p]>=n)
{
Min=min(Min,p);
}
}
}
cout<<m-Min<<endl;
}
}
return 0;
}
hdu 2159 二维完全背包
最新推荐文章于 2021-02-07 11:06:21 发布