继续写DFS的题:
状态记录方法用了一个method变量记录选取过程,看别人题解知道的,不然不知道咋办。我的方法总代码量相对其他的不大
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int sum;
char pp[20];
int pplen;//所给纸片长度
int searchSum;//存储搜索到的当前最优
int searchMethod;//存储到当前最好的方法
int maxtimes;//最大满足条件解次数
//s:当前加数和 method:记录方法
void dfs(int s, int curlen, int method){
int temp;
if(s > sum) return;
if(curlen == pplen){
if(s > searchSum){
searchSum = s;
searchMethod = method;
maxtimes = 1;
}else if(s == searchSum){
maxtimes++;
}
return;
}
for(int i = 1; i <= pplen-curlen; i++){
temp = 0;
for(int j = 0; j < i; j++){
temp = 10*temp + pp[curlen+j] - '0';
}
dfs(s + temp, curlen + i, method*10 + i);
}
}
void printAns(){
int num[20];
int i;
int curlen = 0;
printf("%d ", searchSum);
for(i=0;;i++){
if(searchMethod % 10 != 0){
num[i] = searchMethod % 10;
searchMethod /= 10;
}else break;
}
i--;
while(i > -1){
for(int j = 0; j < num[i]; j++){
printf("%c", pp[curlen + j]);
}
printf(" ");
curlen += num[i];
i--;
}
printf("\n");
}
int main(){
while(~scanf("%d %s", &sum, pp) && !(sum==0&&!strcmp(pp, "0"))){
pplen = strlen(pp);
maxtimes = 0;
searchSum = 0;
dfs(0,0,0);
if(maxtimes == 0){
printf("error\n");
}else if(maxtimes == 1){
printAns();
}else{
printf("rejected\n");
}
}
return 0;
}