参考题解:http://blog.csdn.net/lyy289065406/article/details/6647969 题意和思路在题解都有,思路很简单,奈何我写了好久愣是没实现出来。。。
#include <iostream>#include <cmath>#include <cstring>using namespace std;int aim,result,path,sum,p;int vist[1000000];int Mpow(int a, int b){ int res = 1; while(b) { if(b & 1) res *= a; a = a*a; b >>= 1; } return res;}int getLen(int n){ return (int)log10(n)+1;}int getValue(char *s, int i){ int k = i; int sum = 0; int b,num,p; while(k) { k--; b = i-k-1; num = s[k] - '0'; p = num*Mpow(10,b); sum += p; } return sum;}int getHead(int n, int i){ int len = getLen(n); if(len <= i) return n; return n/Mpow(10,len-i);}int getTail(int n, int i){ return n%Mpow(10,i);}void DFS(char *s, int len){ if(len == 0) { vist[sum]++; if(sum > result && sum <= aim) { result = sum; path = p; } return; } for(int i = 1; i <= len; ++i) { int a = getValue(s,i); sum += a; if(sum > aim) { sum -= a; //continue; return; } p = p*10+i; char b[7]; int j = 0; for(int k = i; k < len; ++k) b[j++] = s[k]; b[j] = '/0'; DFS(b,len-i); sum -= a; p /= 10; } return;}int main(){ while(true) { char s[7]; cin >> aim >> s; int len = strlen(s); int n = getValue(s,len); if(!aim && !n) break; if(aim == n) { cout << aim << " " << n << endl; continue; } int num = n; int k = 0; while(num) { k += num%10; num /= 10; } if(k > aim) { cout << "error" << endl; continue; } result = -1; sum = 0; path = 0; p = 0; memset(vist,0,sizeof(vist)); DFS(s,len); if(vist[result] > 1) cout << "rejected" << endl; else if(vist[result] == 1) { cout << result << " "; int L = getLen(path); for(int i = 1; i <= L; ++i) { int k = getHead(path,1); cout << getHead(n,k) << " "; n = getTail(n,len-=k); path = getTail(path,L-i); } cout << endl; } } return 0;}新闻热点
疑难解答