第十二周 动态规划(二)
来源:互联网 发布:js json数组赋值 编辑:程序博客网 时间:2024/06/07 21:19
算法题目 : Target Sum
算法题目描述:
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.
Example 1:
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.
Note:
- The length of the given array is positive and will not exceed 20.
- The sum of elements in the given array will not exceed 1000.
- Your output answer is guaranteed to be fitted in a 32-bit integer.
算法分析:
这道题目是给定一个非负的整数数组,a1,a2,...,an ,以及一个目标值S,两个符号 + 和 - 。对于每一个整数,你需要从 + 或者 - 中选择一个符号,找出有多少种符号分配方式使得整数的和等于目标S。
用动态规划里面的dp,
sum(P) - sum(N) = target
sum(P) + sum(N) + sum(P) - sum(N) = target + sum(P) + sum(N)
2 * sum(P) = target + sum(nums)
所以原问题就转化成了子数组和问题-----找到一个子集P使得 sum(P) = (target + sum(nums)) / 2
算法代码(C++):
int subsetSum(int* nums, int numsSize, int target) { int ret; int* dp = (int*)malloc((target+1)*sizeof(int)); memset(dp, 0, (target+1)*sizeof(int)); dp[0] = 1; for(int i = 0; i < numsSize; ++i) for(int j = target; j >= nums[i]; --j) dp[j] += dp[j-nums[i]]; ret = dp[target]; free(dp); return ret; } int findTargetSumWays(int* nums, int numsSize, int S) { int sum = 0, target, ret; for(int i = 0; i < numsSize; ++i) sum += nums[i]; if(sum < S || (sum + S)%2) return 0; target = (sum + S)/2; ret = subsetSum(nums, numsSize, target); return ret; }
阅读全文
0 0
- 第十二周 动态规划(二)
- leetcode第十二周解题总结--动态规划
- 动态规划学习二
- 动态规划整理(二)
- 动态规划示例二
- 二、动态规划算法
- 动态规划(二)
- 动态规划入门<二>
- 动态规划(二)
- 动态规划之二
- 第十二周作业二
- 第十二周 任务二
- 第十二周任务二
- 第十二周任务二
- 第十二周 任务二
- 第十二周任务二
- 第十二周任务二
- 第十二周任务二
- Swing实现全屏(覆盖任务栏和不覆盖任务栏)
- spring 对java RMI 的支持
- FPN(feature pyramid networks)算法讲解
- 数据结构——线性表(1)
- 构建高并发网站架构
- 第十二周 动态规划(二)
- 第三次接触Android
- windows下scrapy 的安装
- Tun/Tap interface tutorial
- win10取消自定义快捷键
- linux下使用gdb调试多进程多线程
- error LNK1169 : 找到一个或多个重定义的符号
- 简单选择排序
- Io流,文件复制与文件夹复制