算法基础之整数划分

整数划分

  • 核心思想: 计数类dp

背包做法

  • f[i][j] 表示 取 1 – i 的物品 总容量为j的选法数量

    • f[i][j] = f[i-1][j] + f[i-1][j-v[i]] +f[i-1][j-2v[i]] +f[i-1][j-3v[i]] +……+f[i-1][j-kv[i]]

    • f[i][j-v[i]] = f[i-1][j-v[i]] +f[i-1][j-2v[i]] +f[i-1][j-3v[i]] +……+f[i-1][j-kv[i]]

      • f[i][j] = f[i-1][j] + f[i][j-v[i]]; (本题中 v[i] = i)

      • 在这里插入图片描述

      •   #include<iostream>
          #include<cstring>
          #include<algorithm>
          
          using namespace std;
          const int N = 1010 , mod = 1e9 + 7;;
          
          int n;
          int f[N];
          
          int main()
          {
                 
              cin>>n;
              
              f[0] = 1;  //f[0] 没有数 方法是1种
              for(int i=1;i<=n;i++)
                  for(int j=i;j<=n;j++)
                      //f[i][j - i] = f[i][j - i] + f[i][j - 2] + ... + f[i][j - k]
                      //f[j-i] 
                      f[j] = (f[j] + f[j - i]) % mod;
                      
              cout<<f[n];
          }
        

dp做法

  • f[i][j] 表示总和为i 总共j个数的方案数量

    • 将f[i][j] 分为 最小值是1的方案最小值大于1的方案 两部分 (不重不漏)

      • 最小值是1: 在集合中–1 –> f[i-1][j-1] 总和为i-1 个数为j-1
      • 最小值大于1 : 将集合总每个数-1 –> f[i-j][j] 总和为i-j 个数为j
    • f[i][j] = f[i-1][j-1] + f[i-j][j]

      • 在这里插入图片描述
    • 结果 : res = f[n][1] + f[n][2] +f[n][3] + … + f[n][n] (1个数的方案+2个数的方案+ … +n个数的方案)

      •   #include<iostream>
          #include<cstring>
          #include<algorithm>
          
          using namespace std;
          const int N = 1010 , mod = 1e9 + 7;;
          
          int n;
          int f[N][N];
          
          int main()
          {
                 
              cin>>n;
              
              f[0][0] = 1;
              for(int i=1;i<=n;i++)
              {
                 
                  for(int j=1;j<=i;j++)  //总和为i 个数最多为i
                  {
                 
                      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;
              
              cout<<res;
          }
        

相关推荐

  1. 整数划分———二分+前缀和

    2023-12-28 15:36:08       35 阅读
  2. 算法-划分字母区间

    2023-12-28 15:36:08       22 阅读
  3. 【动态规划初识】整数划分

    2023-12-28 15:36:08       32 阅读
  4. 动态规划 Leetcode 343 整数划分

    2023-12-28 15:36:08       23 阅读
  5. LeeCode前端算法基础100题(18)整数转罗马数字

    2023-12-28 15:36:08       32 阅读
  6. LeeCode前端算法基础100题(17)- 罗马数字转整数

    2023-12-28 15:36:08       32 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-28 15:36:08       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-28 15:36:08       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-28 15:36:08       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-28 15:36:08       20 阅读

热门阅读

  1. 力扣热题100道-哈希篇

    2023-12-28 15:36:08       40 阅读
  2. 你会画菱形吗3044:练9.1 字符菱形

    2023-12-28 15:36:08       40 阅读
  3. 兔子的序列

    2023-12-28 15:36:08       35 阅读
  4. 低时延,可扩展的 l4s 拥塞控制算法

    2023-12-28 15:36:08       39 阅读
  5. LeetCode 75| 位运算

    2023-12-28 15:36:08       40 阅读
  6. C#高级 03委托

    2023-12-28 15:36:08       30 阅读
  7. C语言中的Do While循环:深度解析与实践应用

    2023-12-28 15:36:08       35 阅读
  8. 3D模型gltf下载网站(threejs开发)

    2023-12-28 15:36:08       45 阅读