Leetcode1049:
问题描述:
有一堆石头,用整数数组 stones
表示。其中 stones[i]
表示第 i
块石头的重量。
每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x
和 y
,且 x <= y
。那么粉碎的可能结果如下:
- 如果
x == y
,那么两块石头都会被完全粉碎; - 如果
x != y
,那么重量为x
的石头将会完全粉碎,而重量为y
的石头新重量为y-x
。
最后,最多只会剩下一块 石头。返回此石头 最小的可能重量 。如果没有石头剩下,就返回 0
。
代码及注释:
class Solution {
public:
int lastStoneWeightII(vector<int>& stones) {
//计算和
int sum=0;
for(int i=0;i<stones.size();i++){
sum+=stones[i];
}
//最大背包容量
int cap=sum/2;
//初始化为0,容量为0能装最大价值为0
//ans[i]代表容量为i的背包能放的最大价值
vector<int>ans(cap+1,0);
//找前i个石头背包容量为cap所能放的最大容量
for(int i=0;i<stones.size();i++){
for(int j=cap;j>=stones[i];j--){
//能放下该石头,选择放还是不放的最大值
ans[j]=max(ans[j],ans[j-stones[i]]+stones[i]);
}
}
return sum-2*ans[cap];
}
};
Leetcode494:
问题描述:
给你一个非负整数数组 nums
和一个整数 target
。
向数组中的每个整数前添加 '+'
或 '-'
,然后串联起所有整数,可以构造一个 表达式 :
- 例如,
nums = [2, 1]
,可以在2
之前添加'+'
,在1
之前添加'-'
,然后串联起来得到表达式"+2-1"
。
返回可以通过上述方法构造的、运算结果等于 target
的不同 表达式 的数目。
代码及注释:
class Solution {
public:
//回溯法,DP搞死我算了
int ans;
int findTargetSumWays(vector<int>& nums, int target) {
dfs(0,target,0,nums.size(),nums);
return ans;
}
//sum表示当前选择的元素总和
//targetSum表示目标总和
//已经选了前i个下标了
//总共需要选n个
void dfs(int sum,int targetSum,int i,int n,vector<int>&nums){
if(i==n){
if(sum==targetSum)ans++;
return;
}
dfs(sum+nums[i],targetSum,i+1,n,nums);
dfs(sum-nums[i],targetSum,i+1,n,nums);
}
};