您的位置:首页 > 其它

POJ1416 Shredding Company(dfs)

2013-08-23 15:05 381 查看
题目链接

分析:

这题从早上调到现在。也不算太麻烦,细节吧。

每个数字都只有两种状态,加入前一序列和不加入前一序列。DFS枚举。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <set>
#include <string>
#include <queue>

using namespace std;

int ord[10], len, ans_a[10], tar, max_ans, cnt;
char s[10];
bool flag;

void dfs(int cur_s, int cur_t, int cur) {
if(cur_s+cur_t > tar) {        // error
return ;
}
else if(cur == len) {    //
int t = cur_s + cur_t;
if(t > tar) return ;
else if(t > max_ans) {
cnt = 1;
max_ans = t;
memcpy(ans_a, ord, sizeof(ord));
}
else if(t == max_ans) {
cnt++;
}
flag = true;
return ;
}

ord[cur] = 1;
dfs(cur_s+cur_t+s[cur]-'0', 0, cur+1);

if(cur != len-1) {
ord[cur] = 0;
dfs(cur_s, (cur_t+s[cur]-'0')*10, cur+1);
}
}

int main() {
int n;
//  freopen("my.txt", "r", stdin);

while(scanf("%d %d", &tar, &n) == 2 && (n | tar)) {
flag = false;
max_ans = 0; cnt = 0;

sprintf(s, "%d", n);
len = strlen(s);

dfs(0, 0, 0);

if(!flag) printf("error\n");
else if(cnt >= 2) printf("rejected\n");
else {
printf("%d", max_ans);
int sn=0;
for(int i=0; i<len; i++) {
if(ans_a[i] == 1) {
printf(" %d", sn*10+s[i]-'0');
sn = 0;
}
else {
sn = sn*10+s[i]-'0';
}
}

putchar('\n');
}
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: