洛谷P1025 数的划分【dp】
2024-10-01 06:41:03
将整数nn分成kk份,且每份不能为空,任意两个方案不相同(不考虑顺序)。
例如:n=7n=7,k=3k=3,下面三种分法被认为是相同的。
1,1,51,1,5;
1,5,11,5,1;
5,1,15,1,1.
问有多少种不同的分法。
输入输出格式
输入格式:
n,kn,k (6<n \le 2006<n≤200,2 \le k \le 62≤k≤6)
输出格式:
11个整数,即不同的分法。
输入输出样例
输入样例#1: 复制
7 3
输出样例#1: 复制
4
说明
四种分法为:
1,1,51,1,5;
1,2,41,2,4;
1,3,31,3,3;
2,2,32,2,3.
思路:常用有两种做法,即dp和递归,dp的话要能推得方程dp[i][j]=dp[i-1][j-1]+dp[i-j][j];分析一下:
1. 当i=j时,此时只能为1
2. 当i<j时,毫无疑问为0
3. 当i>j时,分为两种情况
①有1的 ②没有1的
第一种情况,方案数为 f[i-1][x-1]
第二种情况,方案数为 f[i-x][x] (此时 i 必须大于 x)
所以,状态转移方程为: f[i][x]=f[i-1][x-1]+f[i-x][x]
dfs
关键方程dp(i, sum + i, pos + 1);,其中i为第pos(position)个选取的数,
同时加入边界判断:
1. n - sum >= (dv - pos)意义为剩下的至少可以组合得到n(全取1).
2. pos == i时判断cnt+=(sum==n)? 1 : 0;(cnt表示计数)
#include<cstdio>
#include <iostream>
#include<string>
using namespace std;
const int maxn=205;
//const int Mod=100003;
int dp[maxn][8];
int main()
{
int n,k;
scanf("%d%d",&n,&k);
for(int i=1;i<=n;++i)
dp[i][1]=1;
for(int i=1;i<=k;++i)
dp[1][k]=0;
for(int i=2;i<=n;++i)
{
for(int j=2;j<=k;++j)
{
if(i>j)
dp[i][j]=dp[i-1][j-1]+dp[i-j][j];
else
dp[i][j]=dp[i-1][j-1];
}
}
printf("%d\n",dp[n][k]);
return 0;
}
最新文章
- C# DataGridView绑定数据源
- Hibernate注解
- 实验楼 linux 学习
- 更新/替换系统 hosts,轻松访问国外站点
- Java多线程13:读写锁和两种同步方式的对比
- 响应式网站通用css
- 【07_226】Invert Binary Tree
- 转载crontab例行工作调度
- 《A First Course in Probability》-chaper5-连续型随机变量-随机变量函数的分布
- 【模拟】Codeforces 691C Exponential notation
- ionic ion-list 滑到底部自动加载数据案例
- 生成验证码JSP【复用代码】
- SpringBoot03 项目热部署
- idea导入maven项目 傻瓜都能看懂
- pygame 笔记-8 背景音乐&;子弹音效
- [Python列表]-索引
- Spring Http Invoker使用简介
- struts2访问ServletAPI方式和获取参数的方式
- Django之 Model Field Options
- Go:如何组织代码
热门文章
- iOS中UITextView的操作技巧
- redis client 2.0.0 pipeline 的list的rpop bug
- 抽象类(Abstract)和接口的不同点、共同点(Interface)。
- python统计ES存储空间占用的代码
- 第2章 安装Nodejs Nodejs基础 课程介绍
- HTTP权威协议笔记-10.HTTP-NG
- Gym - 101981A The 2018 ICPC Asia Nanjing Regional Contest A.Adrien and Austin 简单博弈
- HTML学习笔记——DOCTYPE和DTD,标准模式和兼容模式
- (转) 前端模块化:CommonJS,AMD,CMD,ES6
- Gradle sync failed: Could not find method android() for arguments 错误的解决办法