分数组合的数量,动态编程帮助,(来自编程访谈的元素,java)

分数组合的数量,动态编程帮助,(来自编程访谈的元素,java),java,recursion,dynamic-programming,Java,Recursion,Dynamic Programming,给定单个游戏的分数和最终目标分数,目标是计算可能组合的数量。(例如,如果目标分数为6,而游戏分数为,则有3种方法可以达到目标分数-3x2、3x1+1x3、1x6) 我不明白为什么我的代码错了: import java.util.*; public class Main { public static int combinations(int target, List<Integer> plays) { Collections.sort(plays);

给定单个游戏的分数和最终目标分数,目标是计算可能组合的数量。(例如,如果目标分数为6,而游戏分数为,则有3种方法可以达到目标分数-3x2、3x1+1x3、1x6)

我不明白为什么我的代码错了:

import java.util.*;
public class Main
{
    public static int combinations(int target, List<Integer> plays) {
        Collections.sort(plays);
        HashMap<Integer, Integer> map = new HashMap<>(); //map score to combinations. 
        map.put(0,1);
        combHelper(target,plays,plays.size() -1, map);
        return map.get(target);
        
    }
    
    private static int combHelper(int target, List<Integer> plays, int i, HashMap<Integer, Integer> map) {
        if (target < 0 || i < 0) {
            return 0;
        }
        if (!map.containsKey(target)) {
            int out = combHelper(target,plays,i - 1, map) + combHelper(target - plays.get(i),plays,i,map);
            map.put(target,out);
        }
        return map.get(target);
    }
    
    public static void main(String[] args) {
        List<Integer> points = new ArrayList<>(Arrays.asList(3,1));
        System.out.println(combinations(6,points)); //output is 2
    }
}

import java.util.*;
公共班机
{
公共静态整数组合(整数目标,列表播放){
收藏。分类(播放);
HashMap map=newhashmap();//将分数映射到组合。
map.put(0,1);
combHelper(target,plays,plays.size()-1,map);
返回map.get(目标);
}
私有静态int-combHelper(int-target、列表播放、int-i、HashMap){
如果(目标<0 | | i<0){
返回0;
}
如果(!map.containsKey(目标)){
int out=combHelper(target,plays,i-1,map)+combHelper(target-plays.get(i),plays,i,map);
地图。放(目标,出去);
}
返回map.get(目标);
}
公共静态void main(字符串[]args){
列表点=新的ArrayList(Arrays.asList(3,1));
System.out.println(组合(6,点));//输出为2
}
}

任何帮助和反馈都将不胜感激

我不知道你的代码有什么问题,但看起来很难理解

我们有一个更简单更容易的方法来解决这个问题,而不需要递归

步骤:

  • 创建一个数组
    dp
    ,大小为
    target+1
  • 对于
    点中的每个点
    更新
    dp
import java.util.List;
导入java.util.array;
公共班机
{   
静态整数noOfWays(列表点、整数目标){
int[]dp=新int[目标+1];
dp[0]=1;
用于(整数点:点)
对于(int i=点;i