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 }

      

  • 相关阅读:
    mysql 远程登陆不上
    hdu 5339 Untitled【搜索】
    SqlServer 书目
    passwordauthentication yes
    oracle 11g RAC ocfs2
    Oracle 11g RAC database on ASM, ACFS or OCFS2
    CentOS ips bonding
    Oracle 11g RAC features
    openStack 王者归来之 trivial matters
    openstack windows 2008 img
  • 原文地址:https://www.cnblogs.com/JJCHEHEDA/p/4665208.html
Copyright © 2011-2022 走看看