hdu 2159 FATE

本文通过一个游戏经验值优化的问题实例,介绍了如何正确理解和运用背包问题的概念,将经验值视为价值,忍耐度作为容量,利用二维数组进行动态规划求解。

本来这题我一直用int f[101][101]; //表示杀掉n只怪得到经验后剩下的忍耐度

后来得到钟大牛指点,才发现我自己对背包的概念完全不理解,背包的价值、容量,这题,应该是经验是价值,忍耐度是容量,因为忍耐度是有限的,而经验是无限的。

还是高中数学老师彭清华那句话:“概念要清晰!!”

//f[i][j] = max(f[i][j], f[i - 1][m - b] + a) //f[i][j]表示杀掉i只怪用掉j忍耐度所能获得最大的经验值 #include <iostream> #include <cmath> #include <cstring> using namespace std; int f[101][101]; int n, m, k, s; int main() { //freopen("1.txt", "r", stdin); while(cin >> n >> m >> k >> s) { memset(f, 0, sizeof(f)); for(int i = 0; i < k; i++) { int a, b; cin >> a >> b; for(int j = b; j <= m; j++) { for(int l = 1; l <= s; l++) { f[l][j] = max(f[l][j], f[l - 1][j - b] + a); } } } bool ok = false; int ans = -1; for(int i = 1; i <= m && !ok; i++) { for(int j = 1; j <= s; j++) { if(f[j][i] >= n) { ans = m - i; ok = true; break; } } } if(ok) cout << ans << endl; else cout << -1 << endl; } return 0; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值