openjudge每日推薦——碎紙機

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int ans,num,m,vis[1000005],now[100],step[100],n;
char s[100];
void dfs(int pos,int sum,int cnt)//當前位置,當前的和,每一種方案的編號(次數) 
{
    if(pos >= m)//保證方案合法後 
    {
        vis[sum] ++;//和爲sum的方案數++ 
        if(sum > ans)//更新 
        {
            ans = sum;
            num = cnt;//cnt賦給num,因爲返回方案後,cnt回到上一個值 
            for(int i = 0; i < cnt; i ++)
            step[i] = now[i];//原理同上,now數組會變 
        }
        return ;//返回方案 
    }
    int t = 0;
    for(int i = pos ; i < m; i ++)
    {
        t = t*10+s[i]-'0';//從前往後的每一位數,依次增加 像123456 >>>1 12 123 1234 12345 123456 
        if(sum + t > n)//判斷合法性 
        return ;
        now[cnt] = t;//把當前搜到的劃分出來的數,賦給編號爲cnt的now數組裏,now數組就存下一種方案的每步的劃分 
        dfs(i+1,sum+t,cnt+1);//繼續搜 
    }
}
int main()
{
    int sum;
    while(scanf("%d%s",&n,s) != EOF )
    {
        m = strlen(s);
        if(m == 1 && n == 0 && s[0] == '0')
        break;
        sum = 0;
        for(int i = 0; i < m; i ++)
        sum +=s[i]-'0';
        if(sum > n)//如果最小和大於n 
        {
            puts("error");//直接輸出錯誤 
            continue;//注意這個地方,一定要加continue,sum>n後就程序就不能再往下了,否則會多輸出錯誤答案,continue用來繼續while循環,也就是下一組數 
        }
        ans = num = 0;
        memset(vis,0,sizeof(vis));
        dfs(0,0,0);//開始搜索 
        if(vis[ans] > 1)//如果方案數大於1 
        puts("rejected");
        else
        {
            printf("%d",ans);
            for(int i = 0; i < num; i ++)
            printf(" %d",step[i]);//輸出最優的方案數中每一個劃分出的數 
            puts("");
        }
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章