本文主要是介绍FATE HDU - 2159 (二维完全背包),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
FATE
题目链接:HDU - 2159
题意:玩游戏时要打怪升级,现差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;
}
这篇关于FATE HDU - 2159 (二维完全背包)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!