编程语言:Java
题目链接:http://poj.org/problem?id=3187
题解:最关键的一步是反向思维,去计算组成最上面的数时,最下面的数每个都用了多少次,然后就可以一直DFS,因为搜索的时候是按照从1到 10的顺序来遍历的,所以当搜索到一个答案时,该答案就是所有可能答案中字典序最小的那个
结果:AC
import java.io.*;
import java.util.Scanner;
public class Main {
static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
static Scanner sc = new Scanner(System.in);
static boolean[] f=new boolean[11];
static int[][] d=new int[11][11];
static int[] a=new int[11];
static int res,n;
public static void main(String[] args) throws IOException {
n=sc.nextInt();
res=sc.nextInt();
d[1][1]=1;
for(int i=2;i<=n;i++){
for(int j=1;j<=i;j++){
d[i][j]=d[i-1][j]+d[i-1][j-1];
}
}
dfs(0,0);
for(int i=0;i<n;i++){
out.printf(a[i]+" ");
}
out.flush();
}
private static boolean dfs(int step, int sum) {
if(step==n){
if(sum==res)
return true;
else
return false;
}
for(int i=1;i<=n;i++){
if(!f[i]){
f[i]=true;
a[step]=i;
if(dfs(step+1,sum+i*d[n][step+1]))
return true;
f[i]=false;
}
}
return false;
}
}