博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CCF NOI1073
阅读量:7291 次
发布时间:2019-06-30

本文共 1021 字,大约阅读时间需要 3 分钟。

题目描述

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

输入

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

输出

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

样例输入

17 3

样例输出

8

数据范围限制

0<=t<= 20, 1<=M,N<=10

 

分析:动态规划或递归都可以。

 

动态规划解法

dp[i][j]表示把i个苹果放在j个盘子上的所有方案,dp[N][M]就是答案。

当i<j时,盘子比苹果多,那么dp[i][j]=dp[i][i];
否则,dp[i][j]=dp[i][j-1]+dp[i-j][j],含有0的时候是dp[i][j-1](有空盘的时候);
不含0的时候是dp[i-j][j],即所有盘子都有苹果,那么从每个盘子取走1个苹果后(总共取走j个),不影响放法数目,即dp[i-j][j],
因此有dp[0][j]=1(初始化);

#include
int dp[20][20];int main(){ int N,M,T; scanf("%d",&T); while(T--) { scanf("%d%d",&N,&M); for(int i=1;i<=N;i++) dp[i][1]=dp[0][i]=1;//初始化 for(int i=1;i<=N;i++) { for(int j=1;j<=M;j++) { if(i
View Code

 

递归解法

f(i,j)的意义与dp[i][j]的意义相同。

#include
int f(int n,int m){ if(n==0||m==1) return 1; if(n
View Code

 

转载于:https://www.cnblogs.com/ACRykl/p/8340440.html

你可能感兴趣的文章
strong_alias && weak_alias && __attribute__
查看>>
js中三个对数组操作的函数 indexOf()方法 filter筛选 forEach遍历 map遍历
查看>>
Histogram Equalization(直方图均衡化)
查看>>
string::substr()简介
查看>>
[LeetCode] Permutations II
查看>>
献给我老公 - Java枚举类型
查看>>
Hadoop简介
查看>>
AD9857和ADS5542昨天调试通过了。
查看>>
MySQL点滴
查看>>
Servlet学习笔记03——什么是DAO?
查看>>
AOJ673 聪明的输入法(字典树)
查看>>
Github常见错误
查看>>
板子集合
查看>>
第四十一课、编辑交互功能的实现------------------狄泰软件学院
查看>>
cocos2d-x之监听手机的物理按键
查看>>
python数据处理excel和pdf,并打包成exe
查看>>
基于 HTML5 WebGL 的低碳工业园区监控系统
查看>>
如何使绝对定位内部元素不继承父级宽度,而是靠内容自动撑开宽度(转载)
查看>>
《程序猿的生命周期》阅读有感
查看>>
重温排序算法
查看>>