设为首页 加入收藏

TOP

递推(三):POJ中的三道递推例题POJ 1664、POJ 2247和POJ 1338(一)
2019-06-14 14:07:56 】 浏览:141
Tags:递推 POJ 例题 1664 2247 1338

【例9】放苹果(POJ 1664)

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

      (1)编程思路。

       设f[m][n]表示把m个苹果放到n个盘子里的不同方法的种数。

      1)当盘子数n为1的时候,只有一种放法,就是把所有苹果放到一个盘子里。

      2)当苹果数m为1的时候,也只有一种放法,因为盘子之间并无顺序,所以不管这个苹果放在哪个盘子里,结果都算一个。

      3)当m<n时,m个苹果最多只能放到m个盘子中去(一个盘子里放一个),盘子有多余的。此时,实际上就相当于把m个苹果放到m个盘子里一样,也就是f[m][m]。

      4)当m>=n时,可分两种情况讨论。一种是至少有一个盘子里不放苹果,这就相当于f[m][n-1];另一种是先取出n个苹果一个盘子里放一个,再将剩下的m-n个苹果放到n个盘子里去,即f[m-n][n]。

综上所述,可得到递推关系式如下:

f[m][n]=1                      当m=1或n=1时

f[m][n] = f[m][m]                当m<n时

f[m][n] = f[m-n][n] + f[m][n-1]     当m>=n时;

      另外,当m=0或n=0时,定义f[m][n]=1。即有盘子没苹果放,或者有苹果没有盘子装,都是一种可能存在的情况。这个可以特殊处理,就像0的阶乘定义为1一样。

(2)源程序。

#include <iostream>

using namespace std;

int main() 

     int f[11][11];

        int t,n,m,i,j; 

     for (i=0;i<=10;i++) 

     {

               f[i][0]=1; 

         f[i][1]=1; 

         f[0][i]=1;

         f[1][i]=1; 

        }

     for (i=2;i<=10;i++) 

        for(j=2;j<=10;j++)

              { 

            if(i>=j) 

                f[i][j]=f[i][j-1]+f[i-j][j]; 

            if(i<j) 

                f[i][j]=f[i][i]; 

        } 

        cin>>t; 

     while(t--)

        { 

         cin>>m>>n; 

         cout<<f[m][n]<<endl; 

     } 

     return 0; 

}

 

【例10】Humble Numbers (POJ 2247)

Description

A number whose only prime factors are 2,3,5 or 7 is called a humble number. The sequence 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, 25, 27, shows the first 20 humble numbers.

Write a program to find and print the nth element in this sequence.

Input

The inpu

首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C++中的传值与传址 下一篇递推(一):递推法的基本思想

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目