二维背包。二维背包也是可以当做一维背包来做的,虽然有点贪心的那中没证明的思想,但是的却是对的。讲讲二维的想法。它主要是有两个限制条件,那么这两个限制条件我们分两次来讨论就好了。无非是在一维的基础上增加一个而已。这时候我们将最多的s个当成另一个背包的容量,那么怪的消耗就是1,数据只有100,总共三个for也就是100W而已。作为一维背包的话,就是完全背包。刚好是s个的时候,我们知道s越大产生的值越大这是常识。多以有这么两种做的方式,今天没有卡时间和空间,以后有卡时间和空间的就要用一维背包来做。
#include<iostream>
using namespace std;
#include<stdio.h>
#include<cstring>
struct S
{
int m;
int s;///怪的数量的最大值
}ss;
struct guai
{
int p;///经验值
int q;///忍耐度
int s;///怪的数量
}Aa[105];
int f[105][105];
int main()
{
int n,k;
int i,j;
while(cin>>n>>ss.m>>k>>ss.s)
{
memset(f,0,sizeof(f));
memset(Aa,0,sizeof(Aa));
for(i=0;i<k;i++)
{
scanf("%d%d",&Aa[i].p,&Aa[i].q);
Aa[i].s=1;
}
int v;
int t;
for(i=0;i<k;i++)
for( v=Aa[i].q;v<=ss.m;v++)
for( t=Aa[i].s;t<=ss.s;t++)
{
f[v][t]=max(f[v-Aa[i].q][t-Aa[i].s]+Aa[i].p,f[v][t]);
}
if(f[ss.m][ss.s]<n){cout<<"-1"<<endl;continue;}
int Max=ss.m;
for( v=1;v<=ss.m;v++)
{
for(t=1;t<=ss.s;t++)
if(f[v][t]>=n&&v<Max)Max=v;
}
cout<<ss.m-Max<<endl;
}
return 0;
}