首页 > 其他分享 >整数划分

整数划分

时间:2024-09-09 21:36:55浏览次数:11  
标签:方案 int 个数 最小值 整数 数都 划分 1e9

方法1:完全背包法

1.状态定义:
f[i][j]: 表示只从1 ~ i中选,且总体积恰好为j的方案数

#include <bits/stdc++.h>
using namespace std;

const int N = 1010, MOD = 1e9 + 7;

int n;
int f[N]; 

//状态定义: f[i][j] : 只从 1 ~ i 中选,且总体积恰好j的集合的数量

int main()
{
    scanf("%d",&n);
    
    f[0] = 1; //一个数都没有选也是一种方案
    
    //完全背包
    for(int i = 1; i <= n; i++){
        for(int j = i ; j <= n; j++){
            f[j] = (f[j] + f[j - i]) % MOD;
        }
    }
    printf("%d",f[n]);
    
    return 0;
}

第二种方法

1.状态定义:

f[i][j] : 总和为 i, 分成 j 个数的方案

2.状态计算:最小值为1的情况和,最小值大于1的情况

最小值为1的情况 :

说明每个方案都存在1,先去掉1,合为 i - 1,分成 j - 1个数的和的方案

最小值大于1的情况:

所有总和为 i,表示的时j个数的和,并且每一个数都严格大于1,因此对每一个数都先减去 1

j个数每一个书都减去1,总和为i - j的就 j个数的和

最后需要每个数的方案数累加

#include <bits/stdc++.h>
using namespace std;

const int N = 1010, MOD = 1e9 + 7;

int n;
int f[N][N];

int main(){
    
    scanf("%d",&n);
    
    f[0][0] = 1;
    
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= i; j++){
            f[i][j] = (f[i-1][j-1] + f[i-j][j]) % MOD;
        }
    }
    int res = 0;
    for(int i = 1; i <= n; i++){
        res = (res + f[n][i]) % MOD;
    }
    printf("%d",res);
    return 0;
}

标签:方案,int,个数,最小值,整数,数都,划分,1e9
From: https://www.cnblogs.com/ltphy-/p/18405390

相关文章

  • 2529. 正整数和负整数的最大计数
    题目链接2529.正整数和负整数的最大计数思路二分法题解链接标准库调用关键点0的处理时间复杂度\(O(\logn)\)空间复杂度\(O(1)\)代码实现:classSolution:defmaximumCount(self,nums:List[int])->int:deflower_bound(val):......
  • 13_罗马数字转整数
    13_罗马数字转整数【问题描述】罗马数字包含以下七种字符:I,V,X,L,C,D和M。字符数值I1V5X10L50C100D500M1000例如,罗马数字2写做II,即为两个并列的1。1......
  • 大整数运算
    首先是遇到了1017A除以B,稀里糊涂地复制了别人的答案就将其抛在脑后(偶然事件),紧接着就遇到了1022D进制的A+B,这时突然记起学习要有打破砂锅问到底的精神,根本不是因为发现这个问题逃避不了,开始了对这个知识点的研究学习。取余运算取余就是取模,可以将其转换为对字符串中的最低数......
  • 南沙信奥赛C++陈老师解一本通题: 1171:大整数的因子
    ​ 【题目描述】已知正整数k满足2≤k≤9,现给出长度最大为30位的十进制非负整数c,求所有能整除c的k。【输入】一个非负整数c,c的位数≤30。【输出】若存在满足 c%k==0的k,从小到大输出所有这样的k,相邻两个数之间用单个空格隔开;若没有这样的k,则输出"none"。【输入样......
  • Java中的整数移位运算符
    对于<<,>>两种运算符,可以这样说:\(a<<b=a*2^b\)\(a>>b=a/2^b\)但是对于>>>...不好说了。这些位运算在计算机中怎样运算的?大家都知道,整数在计算机中是以二进制存储的:\(0=(0)_2\)\(4=(100)_2\)\(8=(1000)_2\)\(20=(10100)_2\)\(666=(1010011010)_2\)左移(<<......
  • 整数在内存中的存储(含整型提升的详解)
    整数在内存中的存储整数的2进制表示法有三种,即:原码、反码和补码有符号的整数,三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,最高位的⼀位是被当做符号位,剩余的都是数值位。           正整数的原、反、补码都相同。      ......
  • 写一个函数判断整数在系统的储存方式为大端还是小端
    1.何为大小端。所谓大小端就是一个整形在电脑系统中以十六进制的储存方式,当一个数据超过一个字节时在内存中储存顺序会有所不同,按照不同的顺序我们分为大小端两种,大端的低字节保存在高位,小端的低字节保存在低端。例如1在系统中的储存方式有小端储存(0x00000001)   ......
  • 06 Windows批处理之整数和浮点数据类型
    在前一篇中,我们详细介绍了字符串和布尔数据类型。在本文中,我将重点讨论数值数据类型,特别是整数和浮点数据类型,详细研究它们。批处理可以轻松地处理整数,无论它们是十进制、十六进制还是八进制。然而,浮点数与布尔数类似,因为批处理实际上并不显式地支持它们作为数据类型。但是,再一次......
  • 51nod 1383 整数分解为2的幂
    整数分解为2的幂这题非常厉害,建议认真看下去虽然我讲的也不好。首先肯定先想到的是多重背包,可以把每个次幂当作物品,然后套板子。但是这题有\(O(n)\)复杂度的做法,我们想如果一个数\(i\)是奇数,那他只能由\((i-1)+1\)转化过来(2的幂次只有1是奇数),那方案数就是\(i-1\)的方案......
  • 【非零段划分 / 2】
    题目思路第一种思路:按照表面题意,枚举p,处理数组后进行计数:复杂度∈O(n......