Problem Description
Cdfpysw loves playing a card game called "Hearthstone". Now he has N cards, he wants to split these cards into 4 piles. Let‘s assume the number of cards in each pile is a1, a2, a3, a4. It must be satisfied that: a1 * k1 = a2 + a3 + a4 a2 * k2 = a1 + a3 + a4 a3 * k3 = a1 + a2 + a4 a1, a2, a3, a4 must be positive Because Cdfpysw is clever, there must be a way to split there card. Can you tell Cdfpysw what is the way?
Input
The first line is an integer T, means the number of cases. Then T lines, each line contains 4 integers, N, k1, k2, k3, meaning of these have been shown in the description. T <= 100 1 <= N <= 109 1 <= k1, k2, k3 <= 200
Output
For each case, you should output "Case #i: " first, i is the case number. Then output 4 integers a1, a2, a3, a4, represent the number of cards in each pile.
Sample Input
1 120 2 3 4
Sample Output
Case #1: 40 30 24 26
import java.util.Scanner; public class Hearthstone { public static int[] a = {1,1,1,1,1}; //基于深度搜索优先的回溯法 public static void DFS(int deep,int n,int[] k,int i){ if(a[1] == n) return; if(a[deep]==n){ //当子节点遍历到n,回溯 a[deep-1]++; DFS(deep-1,n,k,i); } //到第四层,若有解输出并返回,无解则继续向右 if(deep == 4){ if((a[1]+a[2]+a[3]+a[4]) == n){ System.out.println("case #"+i+": "+a[1]+" "+a[2]+" "+a[3]+" "+a[4]); return; } else{ a[deep]++; DFS(deep,n,k,i); } } //满足条件便往下搜索,不满足则剪枝 if(a[deep] < n && deep < 4){ if(a[deep]*k[deep-1] == (n-a[deep])){ DFS(deep+1,n,k,i); } else{ a[deep]++; DFS(deep,n,k,i); } } } public static void main(String[] args) { int T; int n[] = new int[100]; int k1[] = new int[100]; int k2[] = new int[100]; int k3[] = new int[100]; int a=1,b=1,c=1,d=1; Scanner scanner = new Scanner(System.in); T = scanner.nextInt(); for(int i = 1;i <= T;i++){ n[i] = scanner.nextInt(); k1[i] = scanner.nextInt(); k2[i] = scanner.nextInt(); k3[i] = scanner.nextInt(); } //对每一组实例进行求解 for(int i = 1;i <= T;i++){ int[] k = {k1[i],k2[i],k3[i]}; DFS(1,n[i],k,i); } //刚开始用的五层大循环。。醉了 /*for(int i = 1;i <= T;i++){ for(a = 1;a<=n[i];a++){ if(a*k1[i] == (n[i]-a)) for(b = 1;b<=n[i]-a;b++){ if(b*k2[i] == (n[i]-b)) for(c = 1;c<=n[i]-a-b;c++){ if(c*k3[i] == (n[i]-c)) for(d = 1;d<=n[i]-a-b-c;d++){ if((a+b+c+d) == n[i]){ System.out.println("case #"+i+": "+a+" "+b+" "+c+" "+d); } } } } } }*/ } }
时间: 2024-10-05 04:58:24