百练 4102 宠物小精灵之收服 【二维费用01背包】
2018-03-08 21:04
302 查看
传送门
// 题意: 有k个怪物, 告诉每个怪物捕捉它需要的精灵球和皮卡丘收到的伤害, 给定精灵球的一共的数量和皮卡丘总的体力值, 问最多可以捕捉到多少个怪物, 然后如果能捕捉到的怪物相同则要消耗的体力值尽量的小….
思路: 很明显的二维背包费用的题, 加了一维费用那么dp数组同时加一维即可……捡起一个物品所需要付出两种代价, 所以dp[i][u][v] 代表捕捉前i个怪物用掉精灵球u个, 体力值v的能捕捉到的最多怪物个数, 所以转移方程为:
dp[i][u][v] = max(dp[i-1][u][v], dp[i-1][u-a[i]][v-b[i]] + 1);
那么这就跟01背包就比较像了, 同时也可以转化为一维的, 做01背包即可, 最后找答案的时候判断一下即可…..
AC Code
// 题意: 有k个怪物, 告诉每个怪物捕捉它需要的精灵球和皮卡丘收到的伤害, 给定精灵球的一共的数量和皮卡丘总的体力值, 问最多可以捕捉到多少个怪物, 然后如果能捕捉到的怪物相同则要消耗的体力值尽量的小….
思路: 很明显的二维背包费用的题, 加了一维费用那么dp数组同时加一维即可……捡起一个物品所需要付出两种代价, 所以dp[i][u][v] 代表捕捉前i个怪物用掉精灵球u个, 体力值v的能捕捉到的最多怪物个数, 所以转移方程为:
dp[i][u][v] = max(dp[i-1][u][v], dp[i-1][u-a[i]][v-b[i]] + 1);
那么这就跟01背包就比较像了, 同时也可以转化为一维的, 做01背包即可, 最后找答案的时候判断一下即可…..
AC Code
const int maxn = 1e2+5; int dp[1005][505]; int a[maxn], b[maxn]; void solve() { int n, m, k; while(cin >> n >> m >> k) { for (int i = 1 ; i <= k ; i ++) { cin >> a[i] >> b[i]; } Fill(dp, 0); for (int t = 1 ; t <= k ; t ++) { for (int i = n ; i >= a[t] ; i --) { for (int j = m ; j >= b[t] ; j --) { dp[i][j] = max(dp[i][j], dp[i-a[t]][j-b[t]] + 1); } } } int ans1 = 0, ans2 = m; for (int i = 1 ; i <= m ; i ++) { if (dp [i] > ans1) { ans1 = dp [i]; ans2 = m - i; } } cout << ans1 << ' ' << ans2 << endl; } }
相关文章推荐
- 动态规划-二维费用背包-宠物小精灵之收服
- openjudge 宠物小精灵之收服(二维费用背包)
- bailian4102:宠物小精灵之收服(二维费用的01背包)
- 宠物小精灵之收服(二维背包)
- hdu 3496 二维费用的01背包
- 01背包 完全背包 多重背包 二维费用背包
- 01背包问题的扩展——二维费用 LeetCode 474
- NOI 4978 宠物小精灵之收服(二维背包)
- 宠物小精灵之收服(DP,二维背包问题)
- 动态规划:POJ2576-Tug of War(二维费用的背包问题)
- 二维费用背包--poj1948
- Regionals 2014 >> Asia - Taichung 7003 - A Balance Game on Trees 树形DP + 二维费用背包
- 杭电2159 FATE(二维费用背包)
- 榨取kkksc03 luogu1855 dp 裸二维费用背包
- HDU 2159 FATE(二维费用完全背包)
- SDNU1061.采药3【二维费用背包】
- HDU 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 二维费用背包
- M题 二维费用背包
- 二维费用的背包问题
- dd大牛背包九讲(01,完全,多重,混合,二维,分组等背包)(转载+补充)一万二千字!!!