博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
494. Target Sum
阅读量:5343 次
发布时间:2019-06-15

本文共 1116 字,大约阅读时间需要 3 分钟。

/*    这个题两个地方没想到:    第一个:我们把最后的结果分成两部分,一部分是正数的,一部分是负数的,他们的和分别用p和n表示    那么 p-n = s        2p = s+sum        p = (s+sum)/2        由于s和sum是固定的,所以只要找到能组成p的子序列种数就行    第二个:寻找能组成目标值的组合数(直接把做法背下来)     */    public int findTargetSumWays(int[] nums, int S) {        int sum = 0;        for (int num :                nums) {            sum += num;        }        return (sum < S || (sum+S)%2 > 0)?0:dpfun(nums,(sum+S)/2);    }    public int dpfun(int[] nums,int s)    {        //dp[i]是组成目标值为i的组合数        int[] dp = new int[s+1];        dp[0] = 1;        for (int num :                nums) {            //一开始考虑这里为什么是倒着。倒着的话最后一次,较大的数不是用旧的数组成的吗,也就是说在较大的数更新后,比它小的数又更新了,这不就不对吗            //后来想了想,就是不能用更新后的数来组成新的数,因为每次组成数的时候都是用上当前的数num,但是这个数只能用一次,比如组成4的时候用了,组成5的时候就不能num+4了,因为4的组成成分里有num            //倒着做就是为了小的数更新不干扰大的数            //每次把数组中的一个数作为当前数,从大到小更新一遍dp        //每一个num,更新一遍大于num,小于target的数的组合数,因为又有了一种新的组合元素。            //dp[s] = dp[s] + dp[s-num]            for (int i = s; i >=num ; i--) {                dp[i] += dp[i-num];            }        }        return dp[s];    }

 

转载于:https://www.cnblogs.com/stAr-1/p/8035121.html

你可能感兴趣的文章
并查集(Disjoint Set)
查看>>
DB2批处理数据导入
查看>>
【Python3 爬虫】15_Fiddler抓包分析
查看>>
高性能JavaScript-JS脚本加载与执行对性能的影响
查看>>
132-PHP子类和父类同名函数的调用
查看>>
两个队列实现栈和两个栈实现队列
查看>>
Angular路由单页跳转思考
查看>>
4.4 异构、多数据库的存取组件
查看>>
Timer 定时任务
查看>>
购物车跳转view
查看>>
flask项目配置
查看>>
13.IGMP:Internet组管理协议
查看>>
SqlDataAdapter与SqlCommand之间的区别
查看>>
ADO.NET 根据实体类自动生成添加修改语句仅限Oracle使用
查看>>
【UOJ 216】最小花费最短路
查看>>
浏览器控制
查看>>
关于标签之间因为换行等问题造成的空白间距问题处理
查看>>
(三)、LNMP的搭建,并制作rpm包
查看>>
(四)、mysql部署
查看>>
日志管理体系
查看>>