题意:二维容积 S S S和 M M M,种类数 K K K,目标 ≥ N \ge N ≥N
随便写写吧
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<cctype>
using namespace std;
int N,M,K,S;
int xp[105]={},de[105]={};
int F[105][105]={};
int main()
{
while(~scanf("%d%d%d%d",&N,&M,&K,&S))
{
memset(F,0,sizeof(F));
for(int i=1;i<=K;++i)scanf("%d%d",&xp[i],&de[i]);
bool fin=0;
for(int i=1;i<=M;++i) //忍耐度
{
for(int j=1;j<=K;++j) //种类
for(int k=1;k<=S;++k) //个数
if(de[j]<=i)F[i][k]=max(F[i][k],F[i-de[j]][k-1]+xp[j]);
if(F[i][S]>=N)
{
printf("%d\n",M-i);
fin=1;
break;
}
}
if(!fin)printf("-1\n");
}
return 0;
}
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<cctype>
using namespace std;
int N,M,K,S; //还需的经验值 保留的忍耐度 怪的种数 最多杀怪数
int xp[105]={},de[105]={};
int F[105][105]={}; //忍耐度 杀怪数
int main()
{
while(~scanf("%d%d%d%d",&N,&M,&K,&S))
{
memset(F,0,sizeof(F));
for(int i=1;i<=K;++i)scanf("%d%d",&xp[i],&de[i]);
int ans=M+1;
for(int i=1;i<=K;++i) //种类
{
for(int lim,j=de[i];j<=M;++j) //忍耐度
{
lim=min(S,j/de[i]);
for(int k=1;k<=lim;++k) //杀怪数
{
F[j][k]=max(F[j][k],F[j-de[i]][k-1]+xp[i]);
if(F[j][k]>=N)ans=min(ans,j);
}
}
}
if(ans==M+1)printf("-1\n");
else printf("%d\n",M-ans);
}
return 0;
}