题目描述

给定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];
    }
}
扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。