动态规划问题CombinationSum
来源:互联网 发布:淘宝关键词top100 编辑:程序博客网 时间:2024/06/06 09:55
Dynamic Programming
动态规划问题:
给一个候选集C和一个目标值T,找到所有的集合使得集合中的值的和为T。
注意:
1.结果的所有集合中不应有重复的集合。
2.C中的值可以多次出现
3.候选集合中的值和目标值都大于0
输入:[2,3,6,7]和目标值7
输出:[ [7], [2, 2, 3] ]
public class Solution { public List<List<Integer>> combinationSum(int[] candidates, int target) { List<List<List<Integer>>> dp=new ArrayList(); Arrays.sort(candidates); int len = candidates.length; for(int i=1;i<=target;i++){ List<List<Integer>> temp = new ArrayList(); for(int j=0;j<len&&candidates[j]<=i;j++){ if(candidates[j]==i) temp.add(Arrays.asList(candidates[j])); if(candidates[j]<i){ for(List<Integer> m : dp.get(i-candidates[j]-1)){ if(candidates[j]<=m.get(0)){ List<Integer> a=new ArrayList(); a.add(candidates[j]); a.addAll(m); temp.add(a); } } } } dp.add(temp); } return dp.get(target-1); }}
该题使用动态规划求解。直接求T=7的解比较复杂,因此从子问题开始求解,先求解T为1的解,并存储在dp数组中。循环至得到T=7的解。
已知T=1~N-1的解,如何求得T=N的解?
遍历候选集C(数已经由小到大排序)中小于等于N的数A
1.如果A=N, 把数组{A}加入到dp[N]中
2.如果A小于N, 由dp得到N-A的解。对于N-A的解中的每一个List B,如果B的第一个数大于等于A,新建一个数组,先加入A,再加入B的所有数字。(这里是为了确保集合不重复)
0 0
- 动态规划问题CombinationSum
- 动态规划----贪心的动态规划问题
- 动态规划问题
- 动态规划问题
- 动态规划回文问题
- 动态规划 背包问题
- 【动态规划】背包问题
- 动态规划问题
- 动态规划问题
- 【动态规划】加油问题
- 动态规划基本问题
- 动态规划-背包问题
- 动态规划问题
- 动态规划基本问题
- 动态规划---->货郎担问题
- 动态规划+背包问题
- 乘法问题(动态规划)
- 动态规划问题
- 百度地图在scrollview里面滑动冲突解决以及跳转到百度地图app的方法
- Linux字符设备驱动
- C——变量
- 启动Tomcat提示:指定的服务未安装
- Redis 集群方案介绍
- 动态规划问题CombinationSum
- Matlab匿名函数使用规则
- Android AndroidUtilCode-Activity相关工具类
- C———位运算总结
- [BZOJ1355][Baltic2009]Radio Transmission(kmp)
- C++中的类和对象的区别
- RabbitMQ入门之一 生产者、消费者、虚拟主机、信道、交换机、队列、绑定
- iOS多线程相关,同步异步的问题
- POJ2828-Buy Tickets