#include <stdio.h>
#include <stdlib.h>
int t;//目标数
int num;//被拆数
int num_weishu ;//被拆数 位数
int num_data[10];//储存被拆整数的每一位
int data[10];//储存00000至11111状态(1代表可以拆)
int part[10];//储存拆开的数
int ind = 0;
int part_sum_MAX = -1;
int part_same_count;
int part_end[10]={};//
int weishu(int x){//判断整数位数
int weishu = 0;
while(x>0){
x=x/10;
weishu++;
}
return weishu;
}
void part_sum(int ind_temp){//
int part_sum = 0;//
for(int i=0;i<ind_temp;i++){
part_sum += part[i];
}
if(part_sum == part_sum_MAX){
part_same_count++;
}
if((part_sum<=t)&&(part_sum>part_sum_MAX)){
part_sum_MAX = part_sum;
ind =ind_temp;
for(int i=0;i<ind;i++){
part_end[i] = part[i];
}
}
}
void cut(){
int index = -1;//最后一个切点位置
int sum =0 ;//切点 数值
int ten = 1 ;
int ind_temp = 0;//切点数值索引
for(int i=0;i<(num_weishu-1);i++){
if(data[i] == 1){ //计算切点数值
sum = 0;
ten = 1;
for(int j=i;j>index;j--){
sum += num_data[j]*ten;
ten *=10;
}
part[ind_temp] = sum;
ind_temp++;
index = i;
}
}
sum = 0;
ten = 1;
for(int j= (num_weishu-1);j> index;j--){//计算最后一个切点数值
sum += num_data[j]*ten;
ten *=10;
}
part[ind_temp] = sum;
ind_temp++;
part_sum(ind_temp);
}
void Func(int step){
if(step == (num_weishu-1)){
cut();
return;
}
data[step]=0;
Func(step+1);
data[step]=1;
Func(step+1);
}
int main(){
freopen("input.txt","r",stdin);
while(~scanf("%d%d",&t,&num)){
part_sum_MAX= -1;
ind = 0;
part_same_count =0;
num_weishu = 0;
for(int i = 0; i<10 ; i++){//数组初始化
part_end[i] = 0;
}
if((t==0)&&(num == 0))
break;
num_weishu = weishu(num);
for(int i=num_weishu-1;i>=0;i--){//将整数存在数组
num_data[i] = num%10;
num = num/10;
}
Func(0);
if((part_same_count==0)&&(part_sum_MAX != -1)){
printf("%d ",part_sum_MAX);
for(int i=0;i<ind;i++){
printf("%d ",part_end[i]);
}
printf("\n");
}
if(part_same_count!=0){
printf("rejected");
printf("\n");
}
if(part_sum_MAX == -1){
printf("error");
printf("\n");
}
}
}
POJ1416 切纸片 (DFS
最新推荐文章于 2020-02-21 22:42:20 发布