import java.util.Scanner;
public class C1258 {//找出来数 dfs中作为参数循环的变量是 :一直在变的数 但是有固定的上限
static int aim,n,ficnt;//ficnt为一组中全部数 便于输出
static Node array[];
static int finish[] = new int[20];
static boolean have;
static class Node{
int num;
boolean vis;
Node(int num,boolean vis){
this.num = num;this.vis = vis;
}
}
public static void main(String args[]) {
Scanner scan = new Scanner(System.in);
while(scan.hasNext()) {
array = new Node[15];
aim = scan.nextInt();n = scan.nextInt();
for(int i=0;i<n;i++) {
int temp = scan.nextInt();
array[i] = new Node(temp,false);
}
System.out.println("Sum of "+aim);
ficnt =0;have = false;
dfs(0,0);
if(have==false) {
System.out.println("NONE");
}
}
}
static void dfs(int aimcnt,int ncnt) {
if(aimcnt>aim || ncnt>n) {//两个全超界了
return;
}
if(aimcnt == aim) {//数量正好对上
have = true;
for(int i=0;i<ficnt;i++) {
if(i == 0) {System.out.print(finish[i]);}
else {System.out.print("+"+finish[i]);}
}
System.out.println();
}
//继续dfs
for(int i=0;i<n;i++) {
if(!array[i].vis&&array[i].num<=aim) {
if(ficnt>0&&finish[ficnt-1]<array[i].num) {//只保留顺序为从大到小的
continue;
}
array[i].vis = true;
finish[ficnt] = array[i].num;//System.out.println("~~~"+finish[ficnt]);
ficnt++;
dfs(aimcnt+array[i].num,ncnt+1);
array[i].vis = false;
ficnt--;
while(i<n-1&&array[i].num==array[i+1].num) {//去重
i++;
}
}
}
}
}
hdu 1258
最新推荐文章于 2020-03-10 18:40:01 发布