题意:分割一组数,使这些数组成的新的数组的和不大于给定的数。
#include<iostream> #include<cmath> #include<cstring> #include<string> #include<cstdio> #include<algorithm> using namespace std; int n, l, len, ans, tag, rel; char s[30]; int path[22], repath[22]; void dfs(int cur, int sum){ if(sum > n) return; if(cur == len){ if(sum <= n && sum >= ans){ if(sum == ans) tag = 2; else{ ans = sum, rel = 0, tag = 1; for(int i = 0; i < l; i++) repath[rel++] = path[i]; } } return; } int tmp = 0; for(int i = cur; i < len; i++){ tmp = tmp*10 + s[i]-'0'; path[l++] = tmp; dfs(i+1, sum+tmp); l--; } } int main(){ //freopen("a.txt", "r", stdin); while(~scanf("%d%s",&n,s)){ //while(cin >> n >> s){ if(n == 0 && s[0] == '0') break; memset(path,0,sizeof(path)); memset(repath,0,sizeof(repath)); len = strlen(s); ans = 0, l = 0, tag = 0; dfs(0, 0); if(tag == 0) puts("error"); else if(tag == 2) puts("rejected"); else{ cout << ans; for(int i = 0; i < rel; i++) cout << " " << repath[i]; cout << endl; } } return 0; }
题目问题,数组开大一点。
如果这么写:
while(cin >> n >> s){
就 WA。。。。。