zoukankan      html  css  js  c++  java
  • POJ 1416 Shredding Company (dfs)

    题意:给定一个目标数n1,一个操作数n2,需要对操作数进行切割,并且各个和要小于目标数,而且最大。

    由于操作数n2不大,dfs就可以实现,就是小细节很多,需要注意,对0的判断要加上。

    #include <iostream>
    #include
    <cstdio>
    #include
    <algorithm>
    #include
    <memory.h>
    #include
    <cmath>
    #include
    <vector>
    using namespace std;

    const int BORDER = (1<<26)-1;
    #define MAXN 1000000
    #define INF 0x7ffffff
    #define _clr(x,y) memset(x,y,sizeof(x))
    #define _add(x) ((++x)&BORDER)
    #define _in(x) scanf("%d",&x)
    #define _out(x) printf("%d\n",x)
    #define _min(m,v) (m)<(v)?(m):(v)
    #define _max(m,v) (m)>(v)?(m):(v)

    int n,target,arr[10],sum,mmax,tar_len,t_sum,n_index;
    int pre[10],t_pre[10],cnt[MAXN],arr_sum[12];
    int init()
    {
    _clr(pre,
    0);
    _clr(cnt,
    0);
    _clr(arr,
    0);
    _clr(t_pre,
    0);
    mmax
    = -1;
    arr[
    0] = 0;
    target
    = 0;
    return 0;
    }
    int dfs(const int& ilen,const int& cur_pos,const int& index)
    {
    int i,j,len,tmp;
    t_pre[index]
    = ilen;
    t_sum
    = 0;
    for(i = ilen-1; i >=0; --i)
    t_sum
    = t_sum*10 + arr[cur_pos-i];
    if(!index)
    arr_sum[index]
    = t_sum;
    else
    arr_sum[index]
    = arr_sum[index-1] + t_sum;
    tmp
    = arr_sum[index];
    if( tmp > target)
    return 0;
    if(cur_pos == n)
    {
    if( tmp == mmax )
    cnt[tmp]
    = 1;
    else if(tmp > mmax)
    {
    mmax
    = tmp;
    n_index
    = index;
    memcpy(pre,t_pre,
    sizeof(pre));
    }
    }
    len
    = n-cur_pos;
    for(i = 1; i <= len; ++i)
    dfs(i,cur_pos
    +i,index+1);

    return 1;
    }
    int main()
    {
    char str1[10],str2[10];
    int i,j,tmp;
    while(scanf("%s %s",str1,str2))
    {
    init();
    if(str1[0] == '0' && str2[0] == '0')
    break;
    tar_len
    = strlen(str1);
    for(i = 1; i <= tar_len; ++i)
    target
    = target*10 + str1[i-1]-'0';
    n
    = strlen(str2);
    for(i = 1; i <= n; ++i)
    arr[i]
    = str2[i-1] - '0';
    dfs(
    0,0,0);
    if(mmax == -1)
    printf(
    "error\n");
    else if(cnt[mmax])
    printf(
    "rejected\n");
    else
    {
    printf(
    "%d",mmax);
    int cur = 1;
    for(i = 1;i<=n_index; ++i)
    {
    tmp
    = pre[i];
    printf(
    " ");
    for(j = 0; j < tmp; ++j)
    {
    printf(
    "%c",arr[cur]+'0');
    ++cur;
    }
    }
    printf(
    "\n");
    }
    }
    return 0;
    }

  • 相关阅读:
    java学习---集合框架
    java学习--java.util包中常用类
    java学习--java.lang包中常用的类
    JAVA学习--OOP
    Python入门-Hello Word
    【洛谷1452】【模板】旋转卡壳
    【洛谷2766】最长不下降子序列问题(网络流)
    【洛谷3355】骑士共存问题(网络流)
    【洛谷1251】餐巾计划问题(费用流)
    【洛谷3358】最长k可重区间集问题(费用流)
  • 原文地址:https://www.cnblogs.com/lvpengms/p/1701671.html
Copyright © 2011-2022 走看看