FATE
题意:玩游戏时要打怪升级,现差n个经验才能升级,现剩体力为m,有k种怪,最多还能杀s只怪,每只怪击杀后的经验值和消耗体力值分别为ai, bi;问能升级的情况下,所剩体力最大是多少?
思路:主要是看看要把谁看成背包容量,谁看作物体?
这里有两种限制条件,体力和杀怪数目,所以可以看作二维背包,又怪的数量是无穷的,所以是完全背包;
令dp[i][j]为消耗体力i时击杀j只怪所的到的最大经验值;
#include <bits/stdc++.h>
using namespace std;
int dp[110][110], a[110], b[110];
int main(){
int n, m, k, s;
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<=m; i++){
for(int p=1; p<=k; p++){
for(int j=1; j<=s; j++){
if(b[p]<=i)
dp[i][j]=max(dp[i][j], dp[i-b[p]][j-1]+a[p]);
}
}
}
int ans=-1;
for(int i=m; i>0; i--){
if(dp[i][s]>=n) ans=m-i;
}
printf("%d\n", ans);
}
return 0;
}