[poj 1664] 放苹果{动态规划}


题目

题目描述

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

输入输出格式

输入格式:

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

输出格式:

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

输入样例:

1
7 3

输出样例:

8


解题思路

这是一道与‘数的划分’类似的动态规划组合题目,但是‘数的划分’每份不能为空,而‘放苹果’则每一份可以为空。也可以用递归做,下面有两道题解,供大家参考。

  • f ( m , n ) f(m,n) f(m,n) 为m个苹果, n n n个盘子的放法数目,则可以先对 n n n作讨论, 当 n &gt; m n&gt;m n>m:必定有 n − m n-m nm个盘子永远空着,去掉它们对摆放苹果方法数目不产生影响。即 i f ( n &gt; m ) f ( m , n ) = f ( m , m ) if(n&gt;m) f(m,n) = f(m,m) if(n>m)f(m,n)=f(m,m)。 当 n &lt; = m n&lt;=m n<=m:不同的放法可以分成两类:
    1、有至少一个盘子空着,即相当于 f ( m , n ) = f ( m , n − 1 ) f(m,n) = f(m,n-1) f(m,n)=f(m,n1);
    2、所有盘子都有苹果,相当于可以从每个盘子中拿掉一个苹果,不影响不同放法的数目,即 f ( m , n ) = f ( m − n , n ) f(m,n) = f(m-n,n) f(m,n)=f(mn,n).
    而总的放苹果的放法数目等于两者的和,即 f ( m , n ) = f ( m , n − 1 ) + f ( m − n , n ) f(m,n) =f(m,n-1)+f(m-n,n) f(m,n)=f(m,n1)+f(mn,n)
    a [ i ] [ j ] a[i][j] a[i][j]表示把i个苹果放到j个盘子里

  • 递归跟动态规划差不多,也是同样的关系。注意代码2的(n与m)相反


代码(code_1)

#include<cstdio>
using namespace std;
int a[11][11],n,m,t;
void init()
{
   for(int i=1;i<=10;i++)
      a[0][i]=1,a[i][1]=1;
    for(int i=1;i<11;i++)
        for(int j=2;j<=11;j++)
            if(i>=j)
                a[i][j]=a[i][j-1]+a[i-j][j];
            else
                a[i][j]=a[i][j-1];
}

int main()
{
    init();
    scanf("%d",&t);
    while(t--)
    {
      scanf("%d%d",&n,&m);     
      printf("%d\n",a[n][m]);
    }
    return 0;
}

代码(code_2)

#include <cstdio>
using namespace std; 
int t,n,m;
int fun(int n,int m)
{
  if(n==0||m==1) return 1;
  if(m>n) return fun(n,n);
  return fun(n,m-1)+fun(n-m,m);
}
int main()
{
   scanf("%d",&t);
   while(t--)//C++会把t<>0当作true而运行
   {
     scanf("%d%d",&n,&m);
     printf("%d\n",fun(n,m));
   }
   return 0;
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值