POJ 1416报告

继续写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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值