题目有下列:
ProjectEuler:
假设我们有8种不同面值的硬币{1, 2, 5, 10, 20, 50, 100, 200} ,用这些硬币组合构成一个给定的数值n。
例如n=200,那么一种可能的组合方式为200 = 3 * 1 + 1 * 2+ 1 * 5 + 2 * 20 + 1 * 50 + 1 * 100。
问总共有多少种可能的组合方式?
华为面试题:
1分2分5分的硬币三种,组合成1角, 共有多少种组合
创新工厂笔试题:
有1分,2分,5分, 10分四种硬币,每种硬币数量无限,给定n分钱,有多少组合可以组成n分钱。
用了迭代和递归解法
不选当前金币:F(x,y) = F(x-1,y)
选当前面值金币:
选几个当前面值金币
F(x,y) = F(x-1,j-i*coin)
import java.util.*;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
SolutionTest solution = new SolutionTest();
int res = solution.groupCoin(new int[]{1,5,10,25},1000);
System.out.println(res);
res =solution.dfs(1000,new int[]{1,5,10,25},3);
System.out.println(res);
}
}
class SolutionTest {
public int groupCoin(int[]coins,int num){
int n = coins.length;
int m = num;
int[][] dp = new int[n+1][m+1];
for(int i =0;i<=n;i++){
dp[i][0] = 1;
}
for(int i = 1;i<=n;i++){
for(int j =1;j<=m;j++){
dp[i][j] = dp[i-1][j];
int coin = coins[i-1];
for(int k =1;k<=j/coin;k++){
dp[i][j]+=dp[i-1][j-k*coin];
}
}
}
//print(dp);
return dp[n][m];
}
public int dfs(int n ,int[] coins,int cur){
if(cur == 0)return n%coins[cur] == 0?1:0;
int res = 0;
for(int i =0;i*coins[cur]<=n;i++){
int shenyu = n-i*coins[cur];
res += dfs(shenyu,coins,cur-1);
}
return res;
}
public void print(int[][] dp){
for(int[] temp : dp){
System.out.println(Arrays.toString(temp));
}
}
}