硬币找零-回溯

时间:2018-08-23 18:16:43

标签: java dynamic-programming backtracking coin-change

我正在学习和练习DP问题。首先,我从回溯解决方案开始,然后尝试将其转换为DP解决方案。

例如,我试图解决硬币找零问题。下面是我使用回溯的解决方案。

static int  minSofar = Integer.MAX_VALUE;
public static void CoinChange(int[] nums, List<Integer> choosen, int start, int target) {

    if (target==0) {
        System.out.println(choosen);
        if(minSofar>choosen.size())
            minSofar=choosen.size();            
    }
    else if(target>1) {
        for (int i = start; i < nums.length; i++) {
            choosen.add(nums[i]);

            // Explore
            CoinChange(nums, choosen, i,target-nums[i]); // repetation is allowed , to stop the recursion we need to have the r in nCr.

            // Unchoose
            choosen.remove(choosen.size() - 1);

        }
    }
}

public static void main(String[] args) {    
    int [] denominations = {1,2,5};             
    CoinChange(denominations, new ArrayList<Integer>(), 0, 10 );        
    System.out.println("Min : " + minSofar);        
} 

我找到所有可能的组合,总和为10,我找到每个组合的总和并存储最小值。使用全局变量所需的硬币数量。

但是我想返回分钟数。硬币而不是使用全局变量。 我正在通过this的法定答案。它对我们编写的回溯解决方案几乎没有限制,因此可以轻松转换为DP解决方案

限制为:

  1. 它应该是一个函数,使用递归计算答案
  2. 它应该使用return语句返回答案,即不要将其存储在某处
  3. 该函数使用的所有非局部变量都应作为只读变量使用,即该函数只能修改局部变量及其参数。

基本上,我不知道将上述限制并入我的解决方案中,特别是返回值而不是打印它。

有人可以指导我如何思考吗?

0 个答案:

没有答案