• POJ 1416 DFS


    题目翻译:
    公司现在要发明一种新的碎纸机,要求新的碎纸机能够把纸条上的数字切成最接近而不超过target值。比如,target的值是50,而纸条上的数字是12346,应该把数字切成四部分,分别是1、2、34、6。因为这样所得到的和43 (= 1 + 2 + 34 + 6) 是所有可能中最接近而不超过50的。(比如1, 23, 4, 和6 就不可以,因为它们的和不如43接近50,而12, 34, 6也不可以,因为它们的和超过50了。碎纸还有以下三个要求:
    1、如果target的值等于纸条上的值,则不能切。
    2、如果没有办法把纸条上的数字切成小于target,则输出error。如target是1而纸条上的数字是123,则无论你如何切得到的和都比1大。
    3、如果有超过一种以上的切法得到最佳值,则输出rejected。如target为15,纸条上的数字是111,则有以下两种切法11、1或者1、11.
    你的任务是编写程序对数字进行划分以达到最佳值。
    题目翻译转载自:優YoU http://user.qzone.qq.com/289065406/blog/1304031265
    思路:
    一发暴搜敲上去,就A了。。没发现什么坑

    // by SiriusRen
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    int n,minn,sum,len,ans[70],vis[70],flag;
    char m[70];
    void dfs(int pos,int temp){
        if(temp>n)return;
        if(pos==len+1&&minn<=temp){
            if(minn==temp)flag=1;
            else{
                for(int i=1;i<=len;i++)ans[i]=vis[i];
                minn=temp;flag=0;
            }
        }
        int jy=0;
        for(int i=pos;i<=len;i++){
            jy=m[i]+jy*10;
            vis[i]=1;
            dfs(i+1,temp+jy);
            vis[i]=0;
        }
    }
    int main(){
        while(scanf("%d%s",&n,m+1)&&n){
            len=strlen(m+1);flag=minn=sum=0;
            for(int i=1;i<=len;i++)m[i]-='0',sum+=m[i];
            if(sum>n){puts("error");continue;}
            dfs(1,0);
            if(flag){puts("rejected");continue;}
            printf("%d ",minn);
            for(int i=1;i<=len;i++){
                printf("%d",m[i]);
                if(ans[i])putchar(' ');
            }
            putchar('
    ');
        }
    }

    这里写图片描述

  • 相关阅读:
    python
    car-travel project
    数据库
    kafka笔记
    cloudera笔记
    上课笔记
    structured streaming
    SparkSQL
    流数据
    spark厦门大学
  • 原文地址:https://www.cnblogs.com/SiriusRen/p/6532414.html
Copyright © 2020-2023  润新知