经典动态规划之放苹果(洛谷P2386)

传送门

题目背景

(poj1664)

题目描述

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

输入输出格式

输入格式:

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

输出格式:

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

输入输出样例

输入样例#1: 
1
7 3
输出样例#1: 
8
输入样例#2: 
3
3 2
4 3
2 7
输出样例#2: 
2
4
2

当没有苹果时为一种情况,当只有一个盘子时也有一种情况。(全放与不放)

1.若a<b,则必定有b-a个盘子空着 f[a][b]=f[a][a]

若a>b分两种情况。1.若 a个苹果放入b-1个盘子里,有一个为空。f[a][b]=f[a][b-1];

2.若没有空盘子,则从每个盘子中拿出一个苹果对方案无影响。f[a][b]=f[a-b][b] ;

方案数等于两者之和 (不断向外拿,定会有空盘子出现,然后转移至情况1)。

递推法:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
//XHLRC
using namespace std;
int f[11][11]={0},n,m;

void XHN()
{
memset(f,0,sizeof("f"));
for(int i=0;i<=n;i++)
for(int j=1;j<=m;j++)
{  
if(j==1||i==0)f[i][j]=1;
else if(i<j)f[i][j]=f[i][i];
else f[i][j]=f[i-j][j]+f[i][j-1];        
    }
cout<<f[n][m]<<endl;
}
int main(){
    int num;
    scanf("%d",&num);
    while(num--)
    {                
    scanf("%d%d",&n,&m);
    XHN();    
    }
}

 

猜你喜欢

转载自www.cnblogs.com/JCRL/p/9911547.html