zoukankan      html  css  js  c++  java
  • hdu 1539 & poj 1416 某某公司

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1539

    大意是输入n和m,把m按顺序拆分成若干个数,问这些数和的在小于n的前提下最大为多少

    注意必须m的每一位都不能漏,而且要按顺序拆

    比如第一个例子 拆成的各个数为1,2,34 和6,可以拆成34,346但不能是36或364,要按顺序

    而他们和的最大是43

    如果找不出拆法能使各个数的和小于n,输出error

    如果有不止一种拆法子,输出 rejected

    0 0的时候结束 m最多为六位数

    这道题在杭电和北大的oj上都有,但是杭电的数据更强,链接就是杭电的

    既然是按顺序拆,可以看成只是在各个位之间放空格就好了 利用深搜的思想

    从m的第一位开始往后取位,取到刚大于n的前一位(还是小于n的),把取的数加上然后以这一位为起点继续取

    取到的这一位做标记,最后输出的时候没有标记的位数就不要输出空格

    我觉得类似于排列组合的DFS

     1 #include<cstdio>
     2 #include<cstring>
     3 using namespace std;
     4 int n,ans,a[10],b[10],k;
     5 bool flag,pand[10],dapand[10];
     6 void dfs(int pos,int sum,int num)
     7 {
     8     if (sum+num>n)
     9         return ;
    10     if (pos==k)
    11     {
    12         sum+=num;
    13         if (sum<=n&&sum>ans)
    14         {
    15             ans=sum;
    16             flag=false;
    17             for (int i = 0; i < k; i++)
    18                dapand[i] = pand[i];
    19             return ;
    20         }
    21         if (sum==ans)
    22            flag=true;
    23         return ;
    24     }
    25     dfs(pos+1,sum,num*10+a[pos]);//区位置
    26     pand[pos]=true;
    27     dfs(pos+1,sum+num,a[pos]);//加和做比较
    28     pand[pos]=false;
    29 }
    30 int main()
    31 {
    32     int m,i;
    33     while (~scanf("%d %d",&n,&m))
    34     {
    35         if (n==0&&m==0)
    36             break;
    37         memset(pand,false,sizeof(pand));
    38         ans=-1;k=0;
    39         flag=true;
    40         while (m)
    41         {
    42             b[k++]=m%10;
    43             m/=10;
    44         }
    45         for (i=0;i<k;i++)
    46              a[i]=b[k-i-1];
    47         dfs(1,0,a[0]);
    48         if (ans==-1)
    49         {
    50             printf("error
    ");
    51             continue;
    52         }
    53         if (flag)
    54         {
    55             printf("rejected
    ");
    56             continue;
    57         }
    58         printf("%d ",ans);
    59         for (i=0;i<k;i++)
    60         {
    61             if (dapand[i])
    62                printf(" ");
    63             printf("%d",a[i]);
    64         }
    65         printf("
    ");
    66     }
    67     return 0;
    68 }

      

  • 相关阅读:
    2020年捌月份生活随笔
    2020年柒月份生活随笔
    2020年陆月份生活随笔
    第二次:郑州银行杯|2019郑州国际马拉松
    第一次:海尔|2017年青岛马拉松
    专项测试技能和线上线下监控
    实用
    Oracle 数据库 有用的sql语句
    Qt demo
    springboot demo
  • 原文地址:https://www.cnblogs.com/JJCHEHEDA/p/4665208.html
Copyright © 2011-2022 走看看