具有多值的组合问题

1.类似如下的题目

X星球要派出一个5人组成的观察团前往W星。

其中:
A国最多可以派出4人。
B国最多可以派出2人。
C国最多可以派出2人。
D国最多可以派出1人。
E国最多可以派出1人。
F国最多可以派出3人。
那么最终派往W星的观察团会有多少种国别的不同组合呢?

2.通用解法代码

package test;
import java.util.*;

public class Main{
    public static char[] cty="ABCDEF".toCharArray();
    public static int[] count= {6,2,2,1,1,3};
    
    public static int f(int k,int goal,String s) {
        int left=0;
        for(int i=k;i<cty.length;i++) left+=count[i];
        if(left<goal) return 0;
        if(goal==0) {
            System.out.println(s);
            return 1;
        }
        int a=0;
        for(int i=0;i<=count[k]&&i<=goal;i++) {
            StringBuilder sb=new StringBuilder(s);
            for(int j=0;j<i;j++) sb.append(cty[k]);
            count[k]-=i;
            a+=f(k+1,goal-i,sb.toString());
            count[k]+=i;
        }
        return a;
    }
    public static void main(String[] args) {
        //A B C D E F: 4 2 2 1 1 3
        System.out.println(f(0,5,""));
        
    }
    public static int f4(int[] a, int k, int n, String s)
    {
        if(k==a.length){ 
            if(n==0) {System.out.println(s); return 1;}
            return 0;
        }
        int total=0;
        String s2 = s;
        for(int i=0; i<=a[k]; i++){
            total+=f4(a,k+1,n-i,s2);
            s2 += (char)(k+'A');
        }
        return total;
    }
}
原文地址:https://www.cnblogs.com/lshao/p/8618717.html