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

news/2025/3/14 0:59:05/

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

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

一、题目

在这里插入图片描述

二、思路分析

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

1、状态转移方程

(1)状态表示

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

(2)方程书写

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

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

f[i][j]=sum(f[i−1][j−ki])(j≥ki)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=0i=0i=0或者j=0j=0j=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.ppmy.cn/news/8495.html

相关文章

网络原理3 IP地址

网络原理3 IP地址 文章目录网络原理3 IP地址IP协议的报文格式IP地址的具体规则IP地址的组成子网掩码特殊的IP地址IP地址短缺的解决方法动态分配IP地址NAT机制[主流机制]IPv6路由选择网络层中主要做的事情是在两点之间规划出一个合理的路径&#xff0c;同时也要对主机所处的位置…

基于React Native开发的非法App破解记录

目标app YUhSMGNITTZMeTloWm1ZdWJIVnNkWE5wY2k1dFpTOD0 使用jadx反编译&#xff0c;找了一圈没有找到相应代码&#xff0c;看AndroidManifest.xml也不像有加壳的样子。。。 在lib目录下找到libreactnativejni.so文件&#xff0c;看似和react相关&#xff0c;莫非这app是大前端…

EMNLP 22:SetGNER: General Named Entity Recognition as Entity Set Generation

SetGNER: General Named Entity Recognition as Entity Set Generation **任务形式&#xff1a;**识别flat、nest和不连续实体。 **任务建模方式&#xff1a;**采用基于pointer的方式实现任务建模&#xff0c;文本序列中的每个word可以用tag表示&#xff0c;具体为&#xff1…

OpenDDS开发人员指南中文版3.23(1)简介

1 简介 OpenDDS是OMG实时系统数据分发服务(DDS)规范v1.4(OMG文档正式/2015-04-10)和实时发布订阅有线协议DDS互操作性有线协议规范(DDSI-RTPS)v2.3(OMG文件正式/2019-04-03)的开源实现。 OpenDDS还实现了DDSSecurity安全规范v1.1(OMG文档正式/2018-04-01)和DDS XType…

Golang switch 的使用的注意事项和细节

内容来自&#xff1a;尚硅谷-韩老师教学笔记&#xff0c;链接&#xff1a;尚硅谷 1&#xff09;case/switch 后是一个表达式( 即:常量值、变量、一个有返回值的函数等都可以) 2&#xff09;case 后的各个表达式的值的数据类型&#xff0c;必须和 switch 的表达式数据类型一致 3…

golang 自定义命令行flag包简单使用

一、为什么需要使用golang自定义命令行 不恰当的比喻&#xff0c;当我们写了一个服务代码后&#xff0c;按照简单的思维&#xff0c;我们会在业务代码中将要连接的数据库 用户名、主机名、端口号、密码写死。 那么也就意味着我们启动该服务后都只能固定连接某一个数据库&#x…

【数据结构】C语言实现顺序表(超级详细)

目录 概念及结构 接口函数实现 顺序表的初始化 容量判断 顺序表尾插 顺序表尾删 顺序表头插 顺序表头删 顺序表查找 顺序表指定位置插入 顺序表指定位置删除 打印顺序表 销毁顺序表 顺序表完整代码 概念及结构 顺序表作为线性表的一种&#xff0c;它是用一段物理地…

CleanMyMac X免费吗?怎么下载2023最新版

CleanMyMac X是一款专业的Mac清理软件&#xff0c;可智能清理mac磁盘垃圾和多余语言安装包&#xff0c;快速释放电脑内存&#xff0c;轻松管理和升级Mac上的应用。同时CleanMyMac X可以强力卸载恶意软件&#xff0c;修复系统漏洞&#xff0c;一键扫描和优化Mac系统&#xff01;…