POJ1416 切纸片 (DFS

#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");
	}
 }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值