我正在学习和练习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解决方案
限制为:
基本上,我不知道将上述限制并入我的解决方案中,特别是返回值而不是打印它。
有人可以指导我如何思考吗?