题目:零钱兑换
动态规划:dfs是自顶而下的递归,dp是自底而上的递推。动态规划将复杂问题拆分成若干子问题,每个子问题仅仅解决一次,并保存子问题的解,最后导出原问题的解。
用动规解决的问题通常具备以下两个特征:
1.最优子结构(最优化原理):通过求解子问题的最优解,可以获得原问题的最优解。
2.无后效性:
√ 某阶段的状态一旦确定,则此后过程的演变不再受此前各状态及决策的影响(未来与过去无关)
√ 在推导后面阶段的状态时,只关心前面状态的具体值,不关心该状态时怎么演变过来的
动态规划步骤:
1.定义状态:如dp[i]的含义
2.设置初始状态(边界):如dp[ 0 ]的值
3.确定状态转移方程:如dp[ i ]和dp[ i-1 ]的关系
题目描述:
假设有25分,20分,5分,1分的硬币,硬币数量不限,现要找给客户41分的零钱,如何办到使用硬币数量最少?
解析:
定义dp[n]为找给客户n分零钱需要的硬币最少。
假设第一次选择25分的,那么dp[n] = dp[n-25] + 1;
假设第一次选择20分的,那么dp[n] = dp[n-20] + 1;
假设第一次选择5分的, 那么dp[n] = dp[n-5] + 1;
假设第一次选择1分的, 那么dp[n] = dp[n-1] + 1;
在这四种情况中选出需要硬币最少的,这就确定了状态转移方程:
dp[n] = min{ dp[n-25], dp[n-20], dp[n-5],dp[n-1] } + 1;
方式一:
public class _01_零钱兑换_dp {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int N = in.nextInt(); //需要兑换的零钱
in.