题意:
给定一个整数数组 nums 表示不同数额的硬币和一个正整数 target 表示总金额,请你计算并返回可以凑出总金额的的组合数。
如果凑不出 target 则返回 0。
方法一:
动态规划(完全背包)
思路:dp[i]表示硬币凑成 i 的组合数。不同数额的硬币可以取任意个凑成target总金额,因此是完全背包问题。
![]()
class Solution {
public:
int dp[50005]={0};//dp[i]表示凑成i的组合数
int change(int target, vector<int>& nums) {
int n=nums.size();
dp[0]=1;//初始化
for(int i=0;i<n;i++){//完全背包
for(int j=nums[i];j<=target;j++){
dp[j]+=dp[j-nums[i]];
}
}
return dp[target];
}
};
时间复杂度:
空间复杂度:![]()
方法二:
java
思路:java实现。
import java.util.*;
public class Solution {
public int change (int target, int[] nums) {
int[] dp=new int[target+1];//dp[i]表示凑成i的组合数
int n=nums.length;
dp[0]=1;//初始化
for(int i=0;i<n;i++){//完全背包
for(int j=nums[i];j<=target;j++){
dp[j]+=dp[j-nums[i]];
}
}
return dp[target];
}
}
时间复杂度:
空间复杂度:![]()



京公网安备 11010502036488号