放苹果
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 37515   Accepted: 23090

Description

把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。

Input

第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。

Output

对输入的每组数据M和N,用一行输出相应的K。

Sample Input

1
7 3

Sample Output

8

思路:多校见过类似的题目,简单母函数题目,不过比赛的时候,直接给出了解题分析:用的递归写的,感觉不是太理解。

递归:(见注释)

 #include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <algorithm>
#include <sstream>
#include <stack>
using namespace std;
#define mem(a,b) memset((a),(b),sizeof(a))
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define sz(x) (int)x.size()
#define all(x) x.begin(),x.end()
typedef long long ll;
const int inf = 0x3f3f3f3f;
const ll INF =0x3f3f3f3f3f3f3f3f;
const double pi = acos(-1.0);
const double eps = 1e-;
const ll mod = 1e9+;
//head int fun(int m, int n) {
if(n == || m == )//如果剩1个盘子 || 没有苹果可以放
return ;
if(n > m)//如果盘子多于苹果,相当于去除多余盘子
return fun(m, m);
else //前者:所有盘子都有苹果,相当于每一个盘子都拿掉一个。后者:至少有一个空盘子
return fun(m-n, n) + fun(m, n-);
} int _, n, m;
int main() {
for(scanf("%d", &_);_;_--) {
scanf("%d%d", &m, &n);
printf("%d\n", fun(m, n));//m个苹果,n个盘子
}
}

母函数:

理解母函数就是一道裸题,写出各个式子,然后计算,系数即为答案。

有一点比较难理解。我其实一直以为是k++,因为每一项都是,但是题目说了

1,1,5 和 5,1,1是同一种,所以k++会重复,所以用,这样保证了不会重复。

可以理解为拿几个1,拿几个5,这样就避免了重复。

推荐博客:https://www.cnblogs.com/dolphin0520/archive/2012/11/07/2755080.html

母函数计算理解:http://blog.chinaunix.net/uid-26602509-id-3193699.html 

 #include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <algorithm>
#include <sstream>
#include <stack>
using namespace std;
#define mem(a,b) memset((a),(b),sizeof(a))
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define sz(x) (int)x.size()
#define all(x) x.begin(),x.end()
typedef long long ll;
const int inf = 0x3f3f3f3f;
const ll INF =0x3f3f3f3f3f3f3f3f;
const double pi = acos(-1.0);
const double eps = 1e-;
const ll mod = 1e9+;
//head
int c1[], c2[];//c1存展开式的系数,c2计算时保存
int _, m, n;
int main() {
for(scanf("%d", &_);_;_--) {
scanf("%d%d", &m, &n);
for(int i = ; i <= m; i++) {//初始化第一个表达式
c1[i] = ;
c2[i] = ;
}
for(int i = ; i <= n; i++) {//从第二个开始
for(int j = ; j <= m; j++) {//已经累乘的式子的第j项
for(int k = ; k+j <= m; k += i) {//k += i !!!
c2[j+k] += c1[j];
}
}
for(int i = ; i <= m; i++) {//更新
c1[i] = c2[i];
c2[i] = ;
}
}
printf("%d\n", c1[m]);//次数为m的系数即为答案
}
}

最新文章

  1. IOS Core Animation Advanced Techniques的学习笔记(四)
  2. 注意linux下面的命令行,要将PATH声明出来
  3. 如何用MediaCapture解决二维码扫描问题
  4. Netty学习之客户端创建
  5. 夺命雷公狗---Thinkphp----6之管理员的增删改查之-未验证
  6. spring mvc处理json
  7. javascript模板引擎Mustache
  8. Python中函数参数传递问题
  9. sql - 修改结构
  10. 背包问题递归java
  11. java版括号匹配检测
  12. android学习笔记之GridView的使用
  13. 【学习笔记】 使用XML配置和注解实现Spring的依赖注入DI (2-3-2)
  14. centos7.6设置sftp服务
  15. 如何设置.net控件SplitContainer平均分配
  16. Go基础系列:struct的导出和暴露问题
  17. 极简】如何在服务器上安装SSL证书?
  18. 使用PHP进行SOCKET编程
  19. ps遇到的技术问题列表
  20. Android开发 ---xml构建选项菜单、上下文菜单(长按显示菜单)、发通知、发送下载通知

热门文章

  1. windows中git输错密码后不能重新输入的问题
  2. pipeline(管道的连续应用)
  3. 2.《Spring学习笔记-MVC》系列文章,讲解返回json数据的文章共有3篇,分别为:
  4. struts2学习笔记(5)拦截器
  5. 【译】Android 数据库 ORMLite
  6. 第4章 ZK基本特性与基于Linux的ZK客户端命令行学习 4-2 session的基本原理与create命令的使用
  7. 下拉菜单控件JComboBox的使用
  8. ZROI #88
  9. 100085G GCD Guessing Game
  10. 总结:kathasis如何发送get请求获取数据