动态规划问题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
原创粉丝点击