P1025 数的划分

题目描述

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

例如:n=7,k=3,下面三种分法被认为是相同的。

1,1,5; 1,5,1; 5,1,1;

问有多少种不同的分法。

输入输出格式

输入格式:

n,k (6<n<=200,2<=k<=6)

输出格式:

一个整数,即不同的分法。

输入输出样例

输入样例#1:

7 3
输出样例#1:

4

说明

四种分法为:1,1,5;1,2,4;1,3,3;2,2,3;

noip2001年提高组第二题

思路:

一.dfs:直接跑dfs

不剪枝的版本:

#include"bits/stdc++.h"
using namespace std;
]= {},n,k,tot=;

inline void dfs(int s,int t) { //s是拆分的数,t是拆分了几个数
    if(t>k) return;//如果t比拆分的长度大,直接跳出。
    ]; i<=s; i++) //进行拆分。
        if(i<n) {
            a[t]=i;//保存拆分的数
            s-=i;//减去拆分的数
            &&t==k) tot++;//如果拆分完成并且符合长度时,total就加一
            );
            s+=i;//进行回溯
        }
}

int main() {
    cin>>n>>k;
    dfs(n,);
    cout<<tot;
    ;
}
//感谢lyq大佬提供代码 @lyq您真是吊打我

额....838ms,这也太慢了吧!

你们这是什么dfs啊!你们害人不浅啊!

剪枝版本:

原理:

1.按分解的数递增排列

2.上限为a[i]<=m/(k-i+1)

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<string>
#include<cstring>
using namespace std;
;
;
inline int read() {
    char c = getchar();
    , f = ;
    ') {
        ;
        c = getchar();
    }
     + c - ', c = getchar();
    return x * f;
}
],ans,m;
void dfs(int k) {
    )
        return;
    if(k==m) {
        ]) {
            ans++;
        }
        return;
    }
    ]; i<=n/(m-k+); i++) {
        a[k]=i;
        n-=i;
        dfs(k+);
        n+=i;
    }
}
int main() {
    cin>>n>>m;
    a[]=;//设置初始化条件
    dfs();//进行搜索
    cout<<ans;
    ;
}

优化不少吧!我会在下一篇文章里写一下剪枝(原谅我太垃圾了)

二.递推

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<string>
#include<cstring>
using namespace std;
;
;
inline int read() {
    , f = ;
    ; c = getchar();}
     + c - ', c = getchar();
    return x * f;
}
int dt(int n, int k)
{
    ;       //如果n<k 肯定不可能每个盒子都有
    ;    //盒子和小球数相等 每个盒子里一个小球
    ) ;    //盒子只有一个时候 把剩下小球都放进去
    , k-) + dt(n-k, k);
}
int main()
{
    int n=read(), k=read();
    printf("%d", dt(n, k));
    ;
}
//递推做法 

其实和放小球的题一样了....

速度和剪枝差不多,不过好想多了,嘻嘻嘻嘻(可能是我太菜了)

二.dp

和递推差不多就不写了

最新文章

  1. 创建cocos项目并打包
  2. IE6 IE7 ‘JSON’ 未定义
  3. for循环的时候是按照数字递增会造成一些元素被遗漏
  4. 开发环境安装 Java Mysql MyEclipse Android Adt
  5. 关于oracle中传过来的一个多id需要插入到数据库用,分格的存储过程
  6. 当try和finally里都有return时,会忽略try的return,而使用finally的return
  7. 注意事项: Solr设备 Hello World
  8. WCF小实例以及三种宿主
  9. 一步一步深入spring(7)-- 整合spring和JDBC的环境
  10. yii2图片验证码
  11. Webpack 2 视频教程 013 - 自动分离 CSS 到独立文件
  12. h5适配的解决方案
  13. 一HTML基础知识
  14. Flask路由报错:raise FormDataRoutingRedirect(request)
  15. Git学习笔记05-撤销修改
  16. 【sping揭秘】18、使用spring访问数据
  17. 快速安装elkstack
  18. mysql中的 随机字符串的生成
  19. android 获取 imei号码
  20. IOS设计模式第八篇之键值观察模式

热门文章

  1. 解决ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接。
  2. 基于CRM跟进(活动)记录中关键字识别的客户跟进加权值的成单概率算法
  3. Jenkins Installing and migration
  4. nodejs配置nginx 以后链接mongodb数据库
  5. CLOUD SQL跟踪
  6. Python Note1: Pycharm的安装与使用
  7. 阿里云ECS服务器,CentOS 7.4配置jdk+tomcat+mysql
  8. SpringBoot之通过yaml绑定注入数据
  9. 循环神经网络RNN及LSTM
  10. tomcat 和jboss区别