递推中的n个苹果放入m个盘子问题

此处介绍的“苹果放盘子的方案数”属于动态规划问题,在此只介绍两种简单的类型,即可以有空盘和不能有空盘。

以下两道题目即为可以空盘(影分身)和不能空(数的划分)的问题,仔细思考本质其实就是苹果放入盘子的问题。

题目一:鸣人的影分身(openjudge->NOI->2.6->8467)

8467:鸣人的影分身

  • 查看
  • 提交
  • 统计
  • 提问
总时间限制:

1000ms

内存限制:

65536kB

描述

在火影忍者的世界里,令敌人捉摸不透是非常关键的。我们的主角漩涡鸣人所拥有的一个招数——多重影分身之术——就是一个很好的例子。

递推中的n个苹果放入m个盘子问题_第1张图片

影分身是由鸣人身体的查克拉能量制造的,使用的查克拉越多,制造出的影分身越强。

针对不同的作战情况,鸣人可以选择制造出各种强度的影分身,有的用来佯攻,有的用来发起致命一击。

那么问题来了,假设鸣人的查克拉能量为M,他影分身的个数为N,那么制造影分身时有多少种(用K表示)不同的分配方法?(影分身可以被分配到0点查克拉能量)

输入
第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。
输出
对输入的每组数据M和N,用一行输出相应的K。
样例输入
 
     

17 3

样例输出
 
     

8


代码如下:
#include
using namespace std;
int f[11][11],t,n,m;
int main()
{
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%d",&n,&m);
		
		for(int i=0;i<=n;i++)
			for(int j=1;j<=m;j++)
				if(i==0||j==1)//查克拉为0时只能全为0,分成1份时只能有n一种 
					f[i][j]=1;
				else if(j>i)//份数大于查克拉数,大于的部分只能都为0 
					f[i][j]=f[i][i];
				else//当前份数各分配一个查克拉或当前这个为0,其余的分所有查克拉 
					f[i][j]=f[i-j][j]+f[i][j-1];
					
		printf("%d\n",f[n][m]);
	}
	return 0;
}


题目二:数的划分(openjudge->NOI->2.6->8787)

8787:数的划分

  • 查看
  • 提交
  • 统计
  • 提问
总时间限制:

1000ms

内存限制:

65536kB

描述

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

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

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

问有多少种不同的分法。 输出:一个整数,即不同的分法。

输入
两个整数n,k (6 < n <= 200,2 <= k <= 6),中间用单个空格隔开。
输出
一个整数,即不同的分法。
样例输入
 
     

7 3

样例输出
 
     

4

提示
四种分法为:1,1,5;1,2,4;1,3,3;2,2,3。
来源
NOIP2001复赛 提高组 第二题

代码如下:

#include
using namespace std;
int f[201][7],a[201][7],n,m;
int main()
{
	scanf("%d%d",&n,&m); 
	
	for(int j=1;j<=m;j++)
		for(int i=1;i<=n;i++)
			if(j==1||i==j)//划分成1份或者整数等于份数时只有一种 
				f[i][j]=1;
			else if(i>j)//不用第i个“盘子”(但得给一个数字啊),或者用,用则相当于各减一个数的情况 
				f[i][j]=f[i-1][j-1]+f[i-j][j];
			//用了全局变量初始为0,此处省略了:else if(i


这两题代码量很少,可能也基础得没法出题,但对于新手来讲还是值得一想的。毕竟,不积跬步,无以至千里。

你可能感兴趣的:(动态规划)