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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值