题目大意:就是给定一个值,再给定以个整数序列,求从序列总选择出一定的数,来使得,其和为给定的值,并按照要求输出所有的解。
此题就是一个简单地深搜题。注意的点就是注意 按照数字的大小输出,也就是数字的字典序。我们可以先做游程编码,然后组成了一个新的序列。将这个序列按照key值升序。在深搜的时候以当前key值的次数降序的搜索。
//
// main.cpp
// soj 1030: Sum It Up--迭代加深搜索
//
// Created by XD on 15/9/8.
// Copyright (c) 2015年 XD. All rights reserved.
//
#include <iostream>
#include <string>
#include <queue>
#include <stack>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include<vector>
#include <string.h>
#include <string>
#include <algorithm>
#include <set>
#include <map>
#include <cstdio>
using namespace std ;
int t , n,solve ;
int lt[110] ;
struct node{
int key ,num;
node(int key , int num):key(key),num(num){} ;
node(){} ;
};
node stick[110] ;
int all[110] ;
vector<node> path ;
void print()
{
int v , num ;
int len = (int )path.size() ;
for (int i = 0; i < len - 1; i++) {
v = path[i].key ; num = path[i].num ;
for (int j = 0 ; j <num; j++) {
printf("%d+" , v) ;
}
}
v = path[len-1].key ;
num = path[len-1].num ;
for (int i = 0; i < num-1; i++) {
printf("%d+" , v) ;
}
printf("%d\n",v) ;
}
void dfs(int pos , int different,int sum)
{
if (pos == different) {
if (sum == t) {
solve = 1;
print() ;
}
return ;
}
if (sum == t) {
solve = 1 ;
print() ;
return ;
}
int v = stick[pos].key ;
int len =stick[pos].num ;
for (int i =len ; i >= 0 ; i--) {
if (sum + all[different-1]- all[pos] + v*i >= t ) {
path.push_back(node(v , i)) ;
dfs(pos+1, different, sum + v * i ) ;
path.erase(path.end()-1) ;
}
}
}
void solved(int different)
{
solve = 0 ;
printf("Sums of %d:\n" , t) ;
dfs(0 , different , 0) ;
if (!solve) {
printf("NONE\n") ;
}
}
int main() {
while (scanf("%d%d" , &t,&n),n+t) {
for (int i = 0; i < n ; i++) {
scanf("%d" ,<[i]) ;
}
sort(lt,lt+n ) ;
int sticknum = 0 ;int value = - 1;
int different= 0 ;
for (int i = n-1 ; i > -1 ;i--) {
if (value != lt[i]) {
if (value!=-1) {
stick[different++]=node(value,sticknum) ;
}
value = lt[i] ;
sticknum=1 ;
}
else{
sticknum++ ;
}
}
stick[different++] = node(value ,sticknum) ;
all[0] = stick[0].key * stick[0].num ;
for (int i = 1 ; i < different; i++) {
all[i] = 0 ;
all[i] =all[i-1] + stick[i].num* stick[i].key ;
}
path.clear() ;
solved(different) ;
}
return 0;
}