整数拆分问题 动态规划解法
来源:互联网 发布:金丝绒连衣裙新款淘宝 编辑:程序博客网 时间:2024/05/06 23:21
题目链接
我们想要整数 M 拆分成 N 个正数的方案数
我们定义 dp[i][j] 将整数 j 拆分为 i 个正数之和
那么我们分情况考虑,这 i 个正数中是否包含1
如果包含 我们可以先去掉这个1,方案数就是 dp[i-1][j-1]
如果不包含 也就是说所有 i 个正数都 ≥2 那么我们可以把每个数都减一 方案数为 dp[i][j-i]
初始条件是 dp[0][0] = 1
j ≥ i 的时候才有方案
AC代码:
/** @Author: wchhlbt* @Last Modified time: 2017-11-05*/#include <bits/stdc++.h>#define inf 0x3f3f3f3f#define pb push_back#define AA first#define BB second#define ONES(x) __builtin_popcount(x)#define _ << " " <<using namespace std;typedef pair<int, int> P;typedef long long ll ;int dx[4] = {0,0,1,-1};int dy[4] = {1,-1,0,0};const double eps =1e-8;const int mod = 1000000007;const double PI = acos(-1.0);inline int read(){ int num; scanf("%d",&num); return num;}const int maxn = 200007;int dp[30][30];int main(){ //dp[i][j] 恰好用i个盘子容纳j个苹果的方案数 //将整数j拆分为i个正数之和 //存在1 和 不存在1两种情况 int n = 20; dp[0][0] = 1; for(int i = 1; i<=n; i++){ for(int j = i; j<=n; j++){ dp[i][j] = dp[i-1][j-1] + dp[i][j-i]; } } int a,b; while(~scanf("%d%d",&a,&b)){ int ans = 0; for(int i = 1; i<=b; i++){ ans += dp[i][a]; } cout << ans << endl; } return 0;}
阅读全文
0 0
- 整数拆分问题 动态规划解法
- 整数划分问题解法2-动态规划
- 整数划分问题解法2-动态规划
- 整数拆分问题的四种解法
- [动态规划]整数拆分(纯DP)
- 整数划分问题(动态规划)
- 规划问题 0-1型整数规划解法…
- 石子合并问题 --动态规划--解法1
- 01背包问题 动态规划解法
- 0-1背包问题--动态规划解法
- 0-1背包问题动态规划解法
- TSP问题之动态规划解法
- 合唱队问题的动态规划解法
- 【转】 01背包问题 动态规划解法
- 背包问题的动态规划解法
- 01背包问题的动态规划解法
- robber问题的动态规划解法
- 约瑟夫问题(动态规划解法)
- Trie树的详解及其应用
- 欢迎使用CSDN-markdown编辑器
- PID理解笔记
- Java IO File 通过递归程序完成删除某个文件夹(包括里面所有文件)
- 消息队列中间件的技术选型分析
- 整数拆分问题 动态规划解法
- 1043. 输出PATest(20)——C语言
- oracle的存储过程
- 141-Linked List Cycle
- netty源码分析(十六)Channel选择器工厂与轮询算法及注册底层实现
- HDU
- 从0开始学Python--0x01. Python安装
- unity-ugui的text字体模糊解决办法
- 最小路径和