[程序员代码面试指南]递归和动态规划-换钱的方法数(DP,完全背包)

题目描述

给定arr,arr中所有的值都为正数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim,求组成aim的方法数

解题思路

  • 完全背包
  • 和“求换钱的最少张数”的转移来的状态完全相同。
  • 初始化不同
  • 转移方程为:dp[i][j]=dp[i-1][j]+dp[i][j-arr[i]]

代码

public class Solution {
	public int getMeansCnt(int arr[],int aim){
		int[] dp=new int[aim+1];
		
		//initial 
		for(int j=0;j<=aim;++j) {
			dp[j]=0;
		}
		for(int k=0;arr[0]*k<=aim;++k) {//
				dp[arr[0]*k]=1;
		}
		
		for(int i=1;i<arr.length;++i) {
			for(int j=arr[i];j<=aim;++j) {
				dp[j]=dp[j]+dp[j-arr[i]];//
			}
		}
		
		return dp[aim];
	}
}

posted on   coding_gaga  阅读(154)  评论(0编辑  收藏  举报

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示