首页 > 其他分享 >acwing318 划分大理石

acwing318 划分大理石

时间:2023-10-27 14:45:25浏览次数:34  
标签:输出 大理石 样例 划分 acwing318 价值 输入

有价值分别为 1..6 的大理石各 a[1..6]

块,现要将它们分成两部分,使得两部分价值之和相等,问是否可以实现。

其中大理石的总数不超过 20000

输入格式

输入包含多组数据!

每组数据占一行,包含 6

个整数,表示 a[1]∼a[6]

当输入为 0 0 0 0 0 0 时表示输入结束,且该行无需考虑。

输出格式

每组数据输出一个结果,每个结果占一行。

 

如果可以实现则输出 Can,否则输出 Can't

输入样例:

4 7 4 5 9 1
9 8 1 7 2 4
6 6 8 5 9 2
1 6 6 1 0 7
5 9 3 8 8 4
0 0 0 0 0 0

输出样例:

Can't
Can
Can't
Can't
Can 

这题还是比较好写的
我最开始的时候都没看出来这是一个背包
先说说我想到的第一个思路吧
设f[a1][a2][a3][a4][a5][a6]表示在用了a1个1,a2个2·····a6个6的时候是否有可能能够划分为价值相等的两部分
转移就是尝试同时增加两部分价值相等的大理石,距离就是分解数字
比如6=3+3=3+2+1=4+2=2+2+2·····
很多,但是因为只到了6,就能够用类似打表的办法做出来
复杂度应该是O(a[1]*a[2]····*a[6])
直接爆炸
(可能是没睡好脑子不清醒吧。。想出了这么炸裂的做法)

正解

我们只要能够从这些石头里面选出来总价值为sum/2的组合,那就说明这些大理石肯定能够被成功划分(sum是所有大理石的价值和)
所以这就是一个可行性多重背包。。而且因为只有6种,复杂度降低了。。。
就是poj1742coins这题的弱化版
思路一模一样,既然我们已经不关心“最优解”而只关心“可行性”,那那些已知可行的状态自然是没有再转移过去的必要,硬币的数量也不需要浪费在这些情况上面了

感觉在写一次这种题目,有了些新的感受
这种转移的方式其实是为了这种题目专门设计的。。
而并不只是一个简单的改版
积累积累

code

     #include<bits/stdc++.h>
#define ll long long
using namespace std;
inline int read() {
    char c=getchar();int a=0,b=1;
    for(;c<'0'||c>'9';c=getchar())if(c=='-')b=-1;
    for(;c>='0'&&c<='9';c=getchar())a=a*10+c-48;return a*b;
}
bool  f[120001];int a[7],used[120001];
int main()
{
//    freopen(".in","r",stdin);
//    freopen(".out","w",stdout);
    while(1)
    {
        int sum=0;
        memset(f,0,sizeof(f));
        for(int i=1;i<=6;i++)
        {
            a[i]=read();
            sum+=a[i]*i;
        }
        if(sum==0)return 0;
        if(sum%2)
        {
            cout<<"Can't"<<endl;
        }
        else
        {
            f[0]=1;
            for(int i=1;i<=6;i++)
            {
                memset(used,0,sizeof(used));
                for(int j=0;j<=sum/2;j++)
                {
                    if(f[j]&&!f[j+i]&&used[j]<a[i])
                    {
                        f[j+i]=1;
                        used[j+i]=used[j]+1;
                    }
                }
            }
//            for(int i=1;i<=sum/2;i++)cout<<f[i]<<' ';
//            cout<<endl;
            if(f[sum/2])cout<<"Can"<<endl;
            else cout<<"Can't"<<endl;
        }
    }
    return 0;
}

 

标签:输出,大理石,样例,划分,acwing318,价值,输入
From: https://www.cnblogs.com/HLZZPawa/p/17792342.html

相关文章

  • IP子网划分
    三类ip地址A类:0~127B类:128~191C类:192~224子网掩码1对应的部分都是网络号0对应的部分都是主机号主机号的数量决定该局域网中包含多少ip地址子网划分为了防止ip地址的浪费,可以更灵活的适应各种规模的网络网络号为子网号,子网号决定将些其划分为几个网络(例如256划分为2个128......
  • malloc划分内存空间大小
    今天写c语言,犯了一个很失败的错误,类似于typedefint*intp;intpptr=(intp)malloc(sizeof(intp));如果是int,那么本身占用内存就很小,也许能正确运行代码,但是如果内存空间大一点的,肯定直接报错了,因为划分的还没要用的多,。。。。编译器也不会报错。。。......
  • 华为S2326TP-EI交换机端口汇聚(划分vlan做汇聚)
    批量创建Vlan11-20,并将交换机端口1-10分别加入到Vlan中,设置为ass口,[Quidway]system-view     //进入配置视图[Quidway]sysnameSwitchA //给交换机命名[SwitchA]vlanbatch11to20     //同时创建vlan11到vlan20[SwitchA]interfaceethernet0/0/1......
  • Oracle集群升级迁移—主机网络设置及交换机侧bond vlan划分
    目录Oracle集群升级迁移—主机网络设置及交换机bondvlan划分网络规划操作系统层面的IP设置bond类型介绍设置bond1和bond0交换机侧的设置(省略)Oracle集群升级迁移—主机网络设置及交换机bondvlan划分网络规划按照工程师要求,配置了5个IP供集群使用。1个IP为ScanIP、2个IP为VIP......
  • 19_划分LVM逻辑卷
    1.安装包yum-yinstalllvm22.创建卷组#1.查看所有的vdb盘[root@stream9~]#lsblkNAMEMAJ:MINRMSIZEROTYPEMOUNTPOINTSvda253:0020G0disk└─vda1253:1020G0part/vdb253:16010G0disk├─vdb1253:1702G0part......
  • IP地址与子网划分
    IP地址与子网划分1.IP地址1.1为什么用IP地址,不用MAC地址?因为MAC地址由48位二进制数(12位16进制数)组成,这使得MAC地址太复杂,太难记,太难用了;而IPv4地址由32位二进制数(4位十进制数)组成,相对MAC地址使用更加方便1.2IP地址的作用?IP地址是逻辑地址,MAC地址是物理地址,真实存在的,IP地......
  • 子网划分与交换机
    子网划分子网掩码问题一已知IP192.168.2.0/24,平均分配给四个部门使用。写出各个部门的网络号,可用主机地址及广播地址?遇此问题先知IP的网络位是多少位。根据IP地址与子网掩码同时出现可知,本题子网掩码是24.得网络位是24,主机位为8. ①   先给192.168.2.0换成二进制,再根......
  • 计算机的数值转化与网络的IP地址分类与地址划分
    数值转换数字系统由来远古时代是没有数字系统非位置化数字系统:罗马数字(I-1、II-2、III-3、IV-4、V-5、VI-6、VII-7、VIII-8、IX-9、X-10)位置话数字化系统分为二进制;八进制;十进制;十六进制数制计数的方法,指用一组固定的符号和统一的规则表示数值的方法数位指数字符......
  • ABC三类地址、子网掩码及子网划分
    ABC三类地址、子网掩码及子网划分https://blog.csdn.net/weixin_43603028/article/details/103563822A类适用的类型为大型网络,A类网络地址数量较少,有126个网络,每个网络支持的最大主机数为256的3次方-2=16777214台;B类适用的类型为中型网络,B类网络地址数量适中,有16384个网络,每个......
  • 中小型企业级子网划分
     一、基础知识(一)ip地址组成及子网掩码    首先ip地址是由网络部分和主机部分组成,也就是网络位和主机位,用于描述某个范围的某台设备,类似于手机号码的在大陆区号是86,香港的是852,先确定范围,再锁定目标。    那么怎么区分网络位和主机位呢?这就要提到一个新的概念......