链接:http://www.nbuoj.com/v8.83/Problems/Problem.php?pid=2820

链接:https://www.luogu.org/problem/P1025

题意:将整数nn分成kk份,且每份不能为空,任意两个方案不相同(不考虑顺序)。

思路一:可开for暴力,在搜索的过程中进行剪枝,并且可以计算得,最小的数不会大于200/6,即n/k,可以在第一层循环里修改:for(int i=1;i<=n/k;i++)

//保证i<=j<=k<=o<=p<=q的同时,如果i+j+k+o+p+q==n,则cnt++
for(int i=;i<=;i++)
{
for(int j=i;i+j<=;j++)
{
for(int k=j;i+j+k<=;k++)
{
for(int o=k;i+j+k+o<=;o++)
{
for(int p=o;i+j+k+o+p<=;p++)
{
int q=-i+j+k+o+p;
if(q>=p)cnt++;
}
}
}
}
}

思路二:dp,dp[i][j]表示i分成j堆有几种分法

转移方程:当i>j时,dp[i][j]=dp[i-j][j]+dp[i-1][j-1],否则dp[i][j]=0

①k堆里至少有一堆是1,dp[i][j]=dp[i-1][j-1]

②k堆里每堆都大于1,dp[i][j]=dp[i-j][j]

终止条件:i=1或j=1或j=i时,dp[i][j]=1

#include<bits/stdc++.h>
using namespace std;
int main()
{
int dp[][]={},n,k;
cin>>n>>k;
for(int i=;i<=n;i++)
{
for(int j=;j<=k&&j<=i;j++) //j>i时肯定不能保证每堆都有数
{
if(i==||j==||j==i){dp[i][j]=;continue;} //这三个可以由dp[0][0]=1代替...why?
dp[i][j]=dp[i-j][j]+dp[i-][j-];
}
}
cout<<dp[n][k]<<endl;
return ;
}

最新文章

  1. JS--浏览器兼容之new Date
  2. ChartServices Dev图形封装
  3. 通过mdf ldf文件还原数据库
  4. QT打开ROS工作空间时遇到的问题和解决方法
  5. 【转】从INF文件认识驱动
  6. 软件下载网(包括MAC软件大全)
  7. 在linux下通过hexdump生成一个十六进制的文本保存文件,解析此文件转变成正常源代码文件。
  8. Selenium中如何使用xpath更快定位
  9. 多项式A除以B
  10. git同时存在两个账号(在同一台电脑上)——三步完成
  11. python request 请求https verify=False时warning
  12. vue路由vue-router的使用
  13. linux下vim的安装及其设置细节
  14. Java 集合系列0、概述
  15. springboot配置il8n
  16. Salesforce中如何删除调试日志
  17. cocos2d-x笔记 ccTouchesBegan、ccTouchesMoved、ccTouchesEnded
  18. Linux make语法补充
  19. [转][赞]Android开发者必知的开发资源
  20. GPU Instance

热门文章

  1. 201871010114-李岩松《面向对象程序设计(java)》第十一周学习总结
  2. Jenkins初体验-安装与部署服务
  3. centos6升级openssh至7.9
  4. [WPF] Caliburn Micro学习一 Installation
  5. SqlServer2005 查询 第一讲 计算列
  6. 资深架构师Sum的故事:(Mysql)InnoDB下,存储过程中事务的处理
  7. ES6入门十二:Module(模块化)
  8. 领扣(LeetCode)两个数组的交集II 个人题解
  9. 正确理解 PHP 的重载
  10. Java面向对象学习目录