LeetCode494
来源:互联网 发布:淘宝在台湾 编辑:程序博客网 时间:2024/06/07 09:19
EX494
You are given a list of non-negative integers, a1, a2, …, an, and a target, S. Now you have 2 symbols + and -. For each integer, you should choose one from + and - as its new symbol.
Find out how many ways to assign symbols to make sum of integers equal to target S.
Example1:
Input: nums is [1, 1, 1, 1, 1], S is 3. Output: 5Explanation: -1+1+1+1+1 = 3+1-1+1+1+1 = 3+1+1-1+1+1 = 3+1+1+1-1+1 = 3+1+1+1+1-1 = 3There are 5 ways to assign symbols to make the sum of nums be target 3.
Solution:
这仍旧是一道对背包问题的变形,首先nums中的数分成两组,numP与numN,很容易得到: sumP + sumN = sum sumP - sumN = target =====> sumP = (sum + target)/2 ===================>整道题转换为了:求nums中取数,和为(sum + target)/2的不同组合方式的个数
class Solution {public: int findTargetSumWays(vector<int>& nums, int S) { int len = nums.size(), sum = 0; for (int i = 0; i < len; i++) { sum += nums[i]; } //target+sum为奇数时,显然可能的组合方式为0 if (S > sum || S < -sum || (S+sum)%2) { return 0; } return canPartition(nums, (S+sum)/2); } //ex416的变形 int canPartition(vector<int>& nums, int target) { int len = nums.size(); vector<int> dp(target+1, 0); dp[0] = 1; for (int i = 0; i < len; i++) { for (int j = target; j >= nums[i]; j--) { if (dp[j-nums[i]]) { //求个数,所以累加 dp[j] += dp[j-nums[i]]; } } } return dp[target]; }};
阅读全文
0 0
- LeetCode494
- LeetCode494. Target Sum题解
- Leetcode494. 求解目标和个数
- 第四周:( LeetCode494 ) Target Sum(c++)
- leetcode494 TargetSum 非动态规划的解法
- win32获取本地ip
- 记录用户登录操作
- ShareSdk分享工具类
- li浮动,第二排前边几个空了
- linux shuf 随机选择器
- LeetCode494
- cookie与session
- 当宽度为百分比时,如何让高度和宽度一样
- Unity SVN 管理(二)
- 第三天课程总结
- emWin中向LISTVIEW单元格中添加信息
- ubuntu cuda-8.0 下载和安装
- 2017-12-13(虚拟机无法连接网络)
- 美国国家标准技术局发布应用容器安全指南