算法学习之路|平分娃娃

简介: 蒜头君酷爱收集萌萌的娃娃。蒜头君收集了 6种不同的娃娃,第 i 种娃娃的萌值为 i(1≤i≤6)。现在已知每种娃娃的数量 mi​,蒜头君想知道,能不能把娃娃分成两组,使得每组的娃娃萌值之和相同。

蒜头君酷爱收集萌萌的娃娃。蒜头君收集了 6种不同的娃娃,第 i 种娃娃的萌值为 i(1≤i≤6)。现在已知每种娃娃的数量 mi​,蒜头君想知道,能不能把娃娃分成两组,使得每组的娃娃萌值之和相同。

输入格式
输入一行,输入 6 个整数,代表每种娃娃的数量 mi​(0≤mi​≤20,000)。

输出格式
输出一行。如果能把所有娃娃分成萌值之和相同的两组,请输出Can be divided.,否则输出Can't be divided.。

样例输入1
2 0 1 1 2 1
样例输出1
Can't be divided.
样例输入2
2 2 2 2 2 2
样例输出2
Can be divided.

第一种方法:(暴力解决)

行为1~6种,列为萌点的最大值。

dp[sum]即1~6种内,各种组合萌点最接近sum的值。

思路与01背包完全相同,只是最后dp[j]=max(dp[j],dp[j-i],dp[j-2*i].....dp[j-n[i]*i])罢了。
#include<iostream>
#include<algorithm>
using namespace std;
int dp[420001];
int main(){
    int n[7],sum=0;
    for(int i=1;i<=6;++i){
        cin>>n[i];
        sum+=i*n[i];
    }
    if(sum%2!=0)    cout<<"Can't be divided.";
    else
    {
        sum/=2;
        for(int i=1;i<=6;++i){
            for(int j=sum;j>=i;j--){//与01背包思路完全相同
                for(int k=1;k<=n[i];k++)//暴力枚举,其中重复了很多状态。
                    if(j-k*i>=0)    dp[j]=max(dp[j-k*i]+k*i,dp[j]);
            }
        }
        if(dp[sum]==sum)    cout<<"Can be divided.";
        else       cout<<"Can't be divided.";
    }
}

第二种方法:(利用二进制方法优化)

二进制方法将第i种物品分成几个集合:{1,2,4,8,16.....2^k,余数}这些子集加载一起为第i种物品的总数量。

为什么要分子集呢,因为这样可以优化一部分无用的子集,即以上的{3,5,6,7,9,10,11,12,13,14,15}.....

例如:第一种物品n=13,可分为{1,2,4,6}。其中

3=1+2

5=1+4

7=1+2+4

8=2+6

....

13=1+2+4+6

都可以用这些子集表示出来。

这样,在动态规划的过程中,这些3,5,7,8...13都会被这些子集中的状态得到,所以可以省略。


#include<iostream>
#include<algorithm>
using namespace std;
int dp[420001];
int main(){
    int n[7],sum=0;//n[I]第I种的总个数,sum一共的萌点。
    for(int i=1;i<=6;++i){
        cin>>n[i];
        sum+=i*n[i];
    }
    if(sum%2!=0)    cout<<"Can't be divided.";//如果萌点不是偶数,则无法一分为二。
    else
    {
        sum/=2;
        int v[10000];//v[I]表示第I个子集所拥有的萌点。
        int num=0;
        for(int i=1;i<=6;++i){//将1~6种的所有子集和其子集的所有萌点依次存入v[i]
            int tmp=n[i];
            for(int j=1;j<=tmp;j*=2){
                v[++num]=j*i;
                tmp-=j;
            }
            if(tmp>0) v[++num]=tmp*i;//存入余数
        }
        for(int i=1;i<=num;++i){//以子集个数为行
            for(int j=sum;j>=v[i];--j){//以总萌点为列,切记这里从sum开始,为01背包
                dp[j]=max(dp[j-v[i]]+v[i],dp[j]);//及求的是>=sum的最大萌点,转化为01背包问题
            }
        }
        if(dp[sum]==sum)    cout<<"Can be divided.";
        else       cout<<"Can't be divided.";
    }
}
目录
相关文章
|
2月前
|
存储 算法
数据结构与算法学习二二:图的学习、图的概念、图的深度和广度优先遍历
这篇文章详细介绍了图的概念、表示方式以及深度优先遍历和广度优先遍历的算法实现。
61 1
数据结构与算法学习二二:图的学习、图的概念、图的深度和广度优先遍历
|
1月前
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
数据结构与算法系列学习之串的定义和基本操作、串的储存结构、基本操作的实现、朴素模式匹配算法、KMP算法等代码举例及图解说明;【含常见的报错问题及其对应的解决方法】你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
|
2月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
73 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
2月前
|
算法
动态规划算法学习三:0-1背包问题
这篇文章是关于0-1背包问题的动态规划算法详解,包括问题描述、解决步骤、最优子结构性质、状态表示和递推方程、算法设计与分析、计算最优值、算法实现以及对算法缺点的思考。
81 2
动态规划算法学习三:0-1背包问题
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
【EMNLP2024】基于多轮课程学习的大语言模型蒸馏算法 TAPIR
阿里云人工智能平台 PAI 与复旦大学王鹏教授团队合作,在自然语言处理顶级会议 EMNLP 2024 上发表论文《Distilling Instruction-following Abilities of Large Language Models with Task-aware Curriculum Planning》。
|
1月前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习(8)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
1月前
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习之顺序表【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
顺序表的定义和基本操作之插入;删除;按值查找;按位查找等具体详解步骤以及举例说明
|
1月前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之单双链表精题详解(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
1月前
|
存储 Web App开发 算法
2024重生之回溯数据结构与算法系列学习之单双链表【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构之单双链表按位、值查找;[前后]插入;删除指定节点;求表长、静态链表等代码及具体思路详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
|
1月前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!