二位背包其实和一维一样,只是多了一个限制条件,一维一般是体积,这里二维是耐力和杀敌数,因为求最小耐力,所以耐力循环在杀敌循环外面,并且想要拿到经验,最少都要从b[i]开始。完全背包是循环是顺序的。
//
// main.cpp
// Richard
//
// Created by 邵金杰 on 16/9/13.
// Copyright © 2016年 邵金杰. All rights reserved.
//
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=100+10;
int a[maxn],b[maxn],dp[maxn][maxn];
int main()
{
int n,m,k,s;
while(scanf("%d%d%d%d",&n,&m,&k,&s)!=EOF)
{
memset(dp,0,sizeof(dp));
for(int i=0;i<k;i++)
{
scanf("%d%d",&a[i],&b[i]);
}
int min=100000000;
for(int i=0;i<k;i++)
{
for(int j=b[i];j<=m;j++)
{
for(int g=1;g<=s;g++)
{
dp[j][g]=max(dp[j][g],dp[j-b[i]][g-1]+a[i]);
if(dp[j][g]>=n&&j<min) min=j;
}
}
}
if(min==100000000) cout<<-1<<endl;
else cout<<m-min<<endl;
}
return 0;
}