(1)思路:
二维费用背包的模板题,主要是分清谁是背包。
这道题中经验最大,所以经验是背包要得到的价值,忍耐度的消耗和怪的数量都是限制条件。
所以用完全背包即可(注意:限制忍耐度m,怪兽数量s)。
(2)代码实现:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 105;
int dp[maxn][maxn],a[maxn],b[maxn],n,m,k,s;
int main(void){
while(~scanf("%d%d%d%d",&n,&m,&k,&s)){
memset(dp,0,sizeof(dp));
for(int i=1;i<=k;i++) scanf("%d%d",&a[i],&b[i]);
for(int i=1;i<=k;i++){
for(int j=b[i];j<=m;j++){
for(int q=1;q<=s;q++)
if(dp[j-b[i]][q-1]+a[i]>dp[j][q]){
dp[j][q] = dp[j-b[i]][q-1]+a[i];
}
}
}
if(dp[m][s]<n){
printf("-1\n");
continue;
}
int mi = 0;
for(int i=1;i<=m;i++)
if(dp[i][s]>=n){
mi = i;
break;
}
printf("%d\n",m-mi);
}
return 0;
}