poj-1416 Shredding Company DFS

来源:互联网 发布:可视化编程 编辑:程序博客网 时间:2024/04/30 23:12

        题意:有一个碎纸机,给你一个最多有6位数的纸片,需要让你将纸片切开,使得切开的纸片的数值和最接近或等于target值。输入target和纸片,输出最接近target的值和纸片的切法。特殊规则:如果纸片的值和target相等,那么不用切开。如果所有情况下都不存在小于target的切法,那么输出error。如果最终的答案有多种,那么输出rejected。

        思路:DFS搜索所有切开纸片的情况,在对纸片完全分割完后,对各纸片数值和与target进行对比,小于target值,且大于ans值记录各纸片的情况并更新ans值。

#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>#include <cstdlib>#include <stack>#define INF 0x3f3f3f3f#define mod 1000000007using namespace std;int arr[7],que[1010];char str[10];int len,tar,ans,ansl;int flag;void DFS(int t,int pos){    int i;    if(pos>=len)    {        int sum=0;        for (i=0;i<t;i++)        {            sum += que[i];        }        if(sum>tar) return ;        if(sum>ans)        {            flag=0;            ans=sum;            ansl=t;            for (i=0;i<t;i++)            {                arr[i]=que[i];            }        }        if(sum==ans) flag++;        return ;    }    int m=0;    for (i=pos;i<len;i++)    {        m= m*10 + str[i]-'0';        que[t++]=m;        DFS(t,i+1);        t--;    }}int main(){    int i;    while(scanf("%d%s",&tar,str),tar||str[0]!='0')    {        ans=0;flag=0;        int sum=0;        len = strlen(str);        for (i=0;i<len;i++)        {            sum += str[i]-'0';        }        if(sum>tar)        {            printf("error\n");            continue;        }        DFS(0,0);        if(flag>1) printf("rejected\n");        else        {            printf("%d ",ans);            for (i=0;i<ansl;i++)            {                printf("%d ",arr[i]);            }            printf("\n");        }    }    return 0;}


0 0