整数划分——完全背包的变形

news2024/11/14 20:26:43

整数划分——完全背包的变形

  • 一、题目
  • 二、思路分析
    • 1、状态转移方程
      • (1)状态表示
      • (2)方程书写
    • 2、循环与初始化
      • (1)循环
      • (2)初始化
  • 三、代码

一、题目

在这里插入图片描述

二、思路分析

这道题这么看的话还是比较抽象的,但是我们可以将其看作一个完全背包问题, n n n代表的是背包容量,后面的数字组成看作物品的体积,由于这些数字可以重复的使用,所以这道题类似于完全背包,但是在状态表示上还是有点区别的。

1、状态转移方程

(1)状态表示

f ( i , j ) f(i,j) f(i,j):用体积范围[1,i]的物品,去恰好填满一个背包容量为j的书包,满足该要求的方案总数。
完全背包问题是在众多的方案中求一个最大值,而今天的这个问题是求一个总数。

(2)方程书写

这里就不过多的解释了,大家可以去看一看作者写的完全背包问题:

传送门:完全背包的详解与优化

f [ i ] [ j ] = s u m ( f [ i − 1 ] [ j − k i ] )       ( j ≥ k i ) f[i][j]=sum(f[i-1][j-ki])\ \ \ \ \ (j\geq ki) f[i][j]=sum(f[i1][jki])     (jki)

2、循环与初始化

(1)循环

循环设计的话,我们和背包问题保持一致。

    for(int i=1;i<=n;i++)
    {
        for(int j=0;j<=n;j++)
        {
            for(int k=0;k*i<=j;k++)
            {
                f[i][j]=(f[i][j]%mod+f[i-1][j-k*i]%mod)%mod;
            }
        }
    }

(2)初始化

初始化的子问题是我们的最小子问题,找到最小子问题的方法就是将我们循环中的边界带进去。

比如这道题,我们的最小子问题就是当 i = 0 i=0 i=0或者 j = 0 j=0 j=0的时候,等式右边的值。

f [ 1 ] [ 0 ] = f [ 0 ] [ 0 ] + f [ 1 ] [ 0 ] f[1][0]=f[0][0]+f[1][0] f[1][0]=f[0][0]+f[1][0]

f [ 0 ] [ 0 ] f[0][0] f[0][0] f [ i ] [ 0 ] f[i][0] f[i][0]

就是我们要求的子问题, f [ 0 ] [ 0 ] f[0][0] f[0][0]表示用体积为0的物品装满容量为0的背包,很显然就1种方案。

f [ i ] [ 0 ] f[i][0] f[i][0]是指用体积范围1到i的东西装满背包容量为0的物品,很显然这是不合法的,初始化为0。

三、代码

#include<iostream>
using namespace std;
const int N=1e3+10,mod=1e9+7;
int f[N][N];
int n;
int main()
{
    cin>>n;
    f[0][0]=1;
    for(int i=1;i<=n;i++)
    {
        for(int j=0;j<=n;j++)
        {
            for(int k=0;k*i<=j;k++)
            {
                f[i][j]=(f[i][j]%mod+f[i-1][j-k*i]%mod)%mod;
            }
        }
    }
    cout<<f[n][n]<<endl;
}

当然,我们可以使用优化后的方案:

#include<iostream>
using namespace std;
const int N=1e3+10,mod=1e9+7;
int f[N];
int n;
int main()
{
    cin>>n;
    f[0]=1;
    for(int i=1;i<=n;i++)
    {
        for(int j=i;j<=n;j++)
        {
            f[j]=(f[j]%mod+f[j-i]%mod)%mod;
        }
    }
    cout<<f[n]<<endl;
}

优化的思路在完全背包中有详细地讲解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/132278.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docsify使用之Markdown语法

Docsify使用过程中的排版&#xff0c;他是基于Markdown语法的。我们来看一下使用的常用语法&#xff1a; 字体加粗&#xff1a; 在需要加粗的文字前后各加两个** 具体格式如下 **加粗内容** 在需要加粗的文字前后各加一个* 具体格式如下 *倾斜内容* 在需要加粗并且倾斜的…

缅怀2022,展望2023

个人主页&#xff1a;董哥聊技术我是董哥&#xff0c;嵌入式领域新星创作者创作理念&#xff1a;专注分享高质量嵌入式文章&#xff0c;让大家读有所得&#xff01;文章目录1、缘起2、收获3、憧憬不知不觉&#xff0c;2022已然到了最后一天&#xff0c;同时也是我技术创作一周年…

2.脚手架和逆向工程-使用renren开源

1.脚手架工程 脚手架工程提供了业务模块通用的类&#xff0c;比如返回结果封装、异常封装、分页工具类等 比较好用脚手架工程如renren-fast 备份地址 gitgithub.com:nome1024/renren-fast.git 2.逆向工程——使用renren-generator生成代码 逆向工程的作用是根据数据库快速生…

2022年仪器仪表行业研究报

第一章 行业概况 仪器仪表是用以检出、测量、观察、计算各种物理量、物质成分、物性参数等的器具或设备。真空检漏仪、压力表、测长仪、显微镜、乘法器等均属于仪器仪表。仪器仪表是人们对客观世界的各种信息进行测量、采集、分析与控制的手段和设备&#xff0c;是人类了解世界…

MySQL之表的修改和约束条件的添加

修改表中的数据&#xff1a;update[DML] 语法格式&#xff1a; update 表名 set 字段名1值1&#xff0c;字段名2值2&#xff0c;字段名3值3......where 条件;注意&#xff1a;没有条件限制会导致所有数据全部更新 举例&#xff1a; - 将id号为10的学生的姓名改变为"jas…

【自学Python】解释型程序与编译型程序

解释型程序与编译型程序 解释型程序与编译型程序教程 高级语言所编制的程序不能直接被计算机识别&#xff0c;必须经过转换才能被执行&#xff0c;按转换方式可将它们分为两类&#xff1a;解释型程序与编译型程序。 解释型程序 执行方式类似于我们日常生活中的 “同声翻译”…

Vue--》实现todo-list组件的封装与使用

目录 项目结构 创建todolist组件 创建todoinput组件 创建todobutton组件 项目结构 今天用 vite 脚手架搭建一个 vue3 的小案例&#xff0c;vite的搭建过程参考&#xff1a;vite的搭建 。其项目结构组件构成如下&#xff1a;注意&#xff1a;因为使用的是 vite 框架&#x…

51单片机GMS短信自动存取快递柜

实践制作DIY- GC0103-直流电机PID速度控制 一、功能说明&#xff1a; 基于51单片机设计-GMS短信自动存取快递柜 功能介绍&#xff1a; STC89C52RC最小系统板0.96寸OLED显示器DY-SV17F串口语音播报模块4*4矩阵键盘GSM短信模块4路舵机&#xff08;模拟4个柜子&#xff09; ***…

再学C语言21:循环控制语句——do while循环

一、其他赋值运算符 除了最基本的赋值运算符&#xff0c;C还有多个赋值运算符 a b等于a a ba - b等于a a - ba * b等于a a * ba / b等于a a / ba % b等于a a % b 这些赋值运算符的优先级与赋值运算符同样低 运算符优先级&#xff1a;赋值运算符 < 关系运算符 <…

《C++程序设计原理与实践》笔记 第9章 类相关的技术细节

在本章中&#xff0c;我们继续关注主要的程序设计工具——C语言。本章主要介绍与用户自定义类型&#xff08;即类和枚举&#xff09;相关的语言技术细节。这些语言特性大部分是以逐步改进一个Date类型的方式来介绍的。采用这种方式&#xff0c;我们还可以顺便介绍一些有用的类设…

数据结构与算法_五大算法之分治算法

这篇笔记记录分治算法的思想和两道leetcode题。 分治算法思想&#xff1a; 规模为n的原问题的解无法直接求出&#xff0c;进行问题规模缩减&#xff0c;划分子问题&#xff0c;子问题相互独立而且和原问题解的性质是相同的&#xff0c;只是问题规模缩小了。递归地缩小问题规模…

用Python记录一场2023的烟花

弹指间&#xff0c;2023已经到来&#xff0c;新的一年&#xff0c;祝大家新年快乐&#xff0c;阖家幸福呀~~~ 好吧&#xff0c;进入正题&#xff0c;2023的到来&#xff0c;肯定少不了烟花吧&#xff08;外面不让放炮&#xff0c;那咱们就用python放炮【DOGE】&#xff09; 首…

JSON Web Tokens(JWT)简单使用

文章目录什么是JWT&#xff1f;JWD对字符串进行Base64加密JWT加密字符串解释JWT使用场景jwt 特点JWT token在线解密什么是JWT&#xff1f; JWT&#xff08;json web token&#xff09;&#xff0c;它并不是一个具体的技术实现&#xff0c;而更像是一种标准。 JWT规定了数据传输…

Flink系列Table API和SQL之:动态表、持续查询、将流转换成动态表、更新查询、追加查询、将动态表转换为流、更新插入流(Upsert)

Flink系列Table API和SQL之&#xff1a;动态表、持续查询、将流转换成动态表、更新查询、追加查询、将动态表转换为流、更新插入流一、表和流的转换二、动态表三、持续查询四、将流转换成动态表五、更新查询六、追加查询七、将动态表转换为流八、更新插入流(Upsert)一、表和流的…

综合能源系统电压稳定研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【锟斤拷�⊠是怎样炼成的】——两分钟帮你彻底弄懂计算机的编码原理

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; &#x1f33b;&#x1f33b;&#x1f33b;Hello&#xff0c;大家好&#xff0c;我是天寒雨落&#xff0c;一名有趣的博主&#xff0c;小白一枚&#xff0c;多多关照&#x1f61c;&#x1f61c…

解决vue-cli项目打包出现空白页和路径错误的问题

今天为大家分享一篇解决vue-cli(&#xff08;vue-cli2.x版本&#xff09;项目打包出现空白页和路径错误的问题。具有很好的参考价值。希望对大家有所帮助。 vue-cli项目打包&#xff1a; 1. 命令行输入&#xff1a;npm run build 打包出来后项目中就会多了一个文件夹dist&am…

k8s1.23.15版本二进制部署/扩容及高可用架构详解

前言 众所周知&#xff0c;kubernetes在2020年的1.20版本时就提出要移除docker。这次官方消息表明在1.24版本中彻底移除了dockershim&#xff0c;即移除docker。但是在1.24之前的版本中还是可以正常使用docker的。考虑到可能并不是所有项目环境都紧跟新版换掉了docker&#xff…

五、树和二叉树

一、定义及基本术语 详见书本P111~113 二叉树不是树的特殊情况&#xff0c;它们是两个概念&#xff0c;但有关树的基本术语对二叉树都适用。 二叉树的子树一定要区分左子树还是右子树&#xff0c;即使只有一棵子树也一定要说明是左子树还是右子树&#xff0c;树只有一个孩子的…

事务隔离:为什么你改了我还看不见?

提到事务&#xff0c;你肯定不陌生&#xff0c;和数据库打交道的时候&#xff0c;我们总是会用到事务。最经典的例子就是转账&#xff0c;你要给朋友小王转 100 块钱&#xff0c;而此时你的银行卡只有 100 块钱。 转账过程具体到程序里会有一系列的操作&#xff0c;比如查询余…