【无码专区12】子集和(背包dp)

这篇具有很好参考价值的文章主要介绍了【无码专区12】子集和(背包dp)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

此题已自我实现,但仍归于无码专区

本题在考场上就过了,所以难度并不高,发现性质即可。

problem

n n n 个正整数 a 1 , a 2 , . . . , a n a_1,a_2,...,a_n a1,a2,...,an,他们的和为 m m m。你想对于其每一个子集 S S S,求出他们的和。

给定 2 n 2^n 2n [ 0 , m ] [0,m] [0,m] 之间的和,其中数字 i i i 出现了 b i b_i bi 次。

求还原 a a a,数据保证有唯一解。

n ≤ 50 , m ≤ 10000 , 1 s , 128 M B n\le 50,m\le 10000,1s,128MB n50,m10000,1s,128MB

my idea

首先就能知道 b 0 , b m b_0,b_m b0,bm 一定是 1 1 1

马上就发现最小的 a i a_i ai 是没有能被其他数组合出来的情况的,因为他们全是正数!

所以最小的 b i ≠ 0 b_i\neq 0 bi=0 i i i,就意味着 a a a 中原来有 b i b_i bi i i i

然后考虑第二小的 b j ≠ 0 b_j\neq 0 bj=0 j j j,会注意到有可能 b i b_i bi i i i 可能会组合出 j j j

减去这些组合就是 a a a 中原本有 b j ′ b_j' bj j j j

发现这就是个背包 d p dp dp 的过程。

容量 m m m,但最多只会背包 n n n 次。

所以跑得很快。

solution

与我的想法相同。

每次找到子集中最小的元素,也就是最小的 b i b_i bi 不等于 0 0 0 i i i,然后从背包里删去即可。

删除就是可以理解成逆向执行一下背包中加入元素 x x x 的操作,也就是从小到大,执行 b i − = b i − x b_i-=b_{i-x} bi=bix

code文章来源地址https://www.toymoban.com/news/detail-443453.html

#include <bits/stdc++.h>
using namespace std;
#define maxn 55
#define maxm 10005
#define int long long
int n, m, cnt;
int b[maxm], a[maxn], f[maxm];
int c[maxn][maxn];

signed main() {
    freopen( "subset.in", "r", stdin );
    freopen( "subset.out", "w", stdout );
    scanf( "%lld %lld", &n, &m );
    for( int i = 0;i <= n;i ++ ) {
        c[i][0] = c[i][i] = 1;
        for( int j = 1;j < i;j ++ )
            c[i][j] = c[i - 1][j - 1] + c[i - 1][j];
    }
    for( int i = 0;i <= m;i ++ ) scanf( "%lld", &b[i] );
    f[0] = 1;
    for( int i = 1;i <= m;i ++ ) {
        b[i] -= f[i];
        if( ! b[i] ) continue;
        for( int j = 1;j <= b[i];j ++ ) a[++ cnt] = i;
        for( int j = m;j;j -- ) {
            for( int k = 1;k <= b[i];k ++ )
                if( j < k * i ) break;
                else f[j] += f[j - k * i] * c[b[i]][k];
        }
    }
    for( int i = 1;i <= n;i ++ ) printf( "%lld ", a[i] );
    return 0;
}

到了这里,关于【无码专区12】子集和(背包dp)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Leetcode动态规划篇(0-1背包问题一维和二维dp实现)

    🤗专栏:每日算法学习 💬个人主页:个人主页 🤓情况描述:有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。每一件物品其实只有两个状态,取或者不取。

    2023年04月09日
    浏览(43)
  • 算法训练第四十二天|01背包问题 二维 、01背包问题 一维、416. 分割等和子集

    视频链接:https://www.bilibili.com/video/BV1cg411g7Y6/ 参考:https://programmercarl.com/%E8%83%8C%E5%8C%85%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%8001%E8%83%8C%E5%8C%85-1.html 对于面试的话,其实掌握01背包,和完全背包,就够用了,最多可以再来一个多重背包。 而完全背包又是也是01背包稍作变化而来,即:完全

    2024年02月01日
    浏览(46)
  • 代码随想录day42|背包问题、416. 分割等和子集

     背包问题:    01 背包 二维数组dp[i][j]解法 纯01背包:有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。 每件物品只能用一次 ,求解将哪些物品装入背包里物品价值总和最大。 dp[i][j]:从下标为[0-i]的物品里任意取,放进容量为j的

    2024年04月09日
    浏览(64)
  • 【LeetCode动态规划#06】分割等和子集(01背包问题一维写法实战)

    分割等和子集 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。 示例 1: 输入:nums = [1,5,11,5] 输出:true 解释:数组可以分割成 [1, 5, 5] 和 [11] 示例 2: 输入:nums = [1,2,3,5] 输出:false 解释:数组不能分割

    2023年04月09日
    浏览(67)
  • 解决背包衍生题目:单词拆分和分割等和子集--动态规划方式深度呈现

    目录 139. 单词拆分 解题思路 代码实现 416. 分割等和子集 二维动态规划 状态压缩(一维) 问题拓展 背包九讲知识总结 相关问题 题目描述 给你一个字符串  s  和一个字符串列表  wordDict  作为字典。请你判断是否可以利用字典中出现的单词拼接出  s  。 注意: 不要求字典中

    2024年02月03日
    浏览(51)
  • 代码随想录 Day35 动态规划04 01背包问题和完全背包问题 LeetCode T416 分割等和子集

    说到背包问题大家都会想到使用动规的方式来求解,那么为什么用动规呢, dp数组代表什么呢 ? 初始化是什么 , 遍历方式又是什么 ,这篇文章笔者将详细讲解背包问题的经典例题0-1背包问题和完全背包问题的解题方式,希望能帮助到大家 有人一提到背包问题就只会使用动态规划来

    2024年02月06日
    浏览(77)
  • 力扣算法刷题Day42|动态规划:01背包问题 分割等和子集

    力扣题目:01背包问题(二维数组) 刷题时长:参考题解 解题方法:动态规划 + 二维dp数组 复杂度分析 时间 空间 问题总结 理解递推公式困难 本题收获 动规思路:两层for循环,第一层i遍历物品,第二层j枚举背包容量以内所有值 确定dp数组及下标的含义:dp[i][j] 表示从下标

    2024年02月13日
    浏览(62)
  • 第九章 动态规划part04(● 01背包问题,你该了解这些! ● 01背包问题,你该了解这些! 滚动数组 ● 416. 分割等和子集 )

    ● 01背包问题,你该了解这些! ● 01背包问题,你该了解这些! 滚动数组 ● 416. 分割等和子集 https://programmercarl.com/%E8%83%8C%E5%8C%85%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%8001%E8%83%8C%E5%8C%85-1.html 视频讲解:https://www.bilibili.com/video/BV1cg411g7Y6 1.确定dp数组以及下标的含义 i是物品,j是背包容量

    2024年01月16日
    浏览(52)
  • 动态规划DP之背包问题3---多重背包问题

    目录 DP分析: 优化:  二进制优化 例题:         01背包是每个物品只有一个,完全背包问题是每个物品有无限个。         那么多重背包问题就是 每个物品有有限个 。 有 N 种物品和一个容量是 V 的背包。 第 i 种物品最多有 si 件,每件体积是 vi,价值是 wi。 求解

    2024年03月20日
    浏览(49)
  • 【Day42】代码随想录之动态规划0-1背包_416. 分割等和子集

    动态规划理论基础 动规五部曲: 确定dp数组 下标及dp[i] 的含义。 递推公式:比如斐波那契数列 dp[i] = dp[i-1] + dp[i-2]。 初始化dp数组。 确定遍历顺序:从前到后or其他。 推导dp数组。 出现结果不正确: 打印dp日志和自己想的一样:递推公式、初始化或者遍历顺序出错。 打印

    2024年02月20日
    浏览(69)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包