二手书交易网站开发与设计,wordpress新闻抓取插件,广州各区进一步强化,俄罗斯军事基地题目#xff1a;
有一堆石头#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。
每一回合#xff0c;从中选出任意两块石头#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y#xff0c;且 。那么粉碎的可能结果如下#xff1a;
…题目
有一堆石头用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。
每一回合从中选出任意两块石头然后将它们一起粉碎。假设石头的重量分别为 x 和 y且 。那么粉碎的可能结果如下
如果 那么两块石头都会被完全粉碎 如果 那么重量为 x 的石头将会完全粉碎而重量为 y 的石头新重量为 。 最后最多只会剩下一块 石头。返回此石头 最小的可能重量 。如果没有石头剩下就返回 0。
示例 解法
本题物品的重量为stones[i]物品的价值也为stones[i]。
对应着01背包里的物品重量weight[i]和 物品价值value[i]。
动规五部曲
1确定dp数组以及下标的含义
01背包中dp[j]容量为j的背包最多可以装的价值为 dp[j]。
本题中石头的重量是 stones[i]石头的价值也是 stones[i] 可以 “ 最多可以装的价值为 dp[j] ” “ 最多可以背的重量为dp[j] ”
2确定递推公式
01背包的递推公式为dp[j] max(dp[j], dp[j - weight[i]] value[i]);
本题则是dp[j] max(dp[j], dp[j - stones[i]] stones[i]);
3dp数组如何初始化vectorint dp(bagweight1,0);
4确定遍历顺序先遍历物品后遍历背包容量
5举例推导dp数组
class Solution {
public:int lastStoneWeightII(vectorint stones) {//背包容量为所有石头重量/2;//转换成01背包问题背包容量最多能装多少石头int nstones.size();int sumaccumulate(stones.begin(),stones.end(),0);int bagweightsum/2;vectorint dp(bagweight1,0);for(int i0;in;i){for(int jbagweight;jstones[i];j--){dp[j]max(dp[j],dp[j-stones[i]]stones[i]);}}return sum-2*dp[bagweight];}
};