zoukankan      html  css  js  c++  java
  • POJ 1664 递推

     

    放苹果

     

    Time Limit: 1000MS   Memory Limit: 10000K
    Total Submissions: 26924   Accepted: 17110

     

    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

     

    Source

     

     

     

    POJ 1664 解题思路:

    如果i<j:dp[i][j]=dp[i][i];

    否则:如果第j个盒子不放苹果:dp[i][j]=dp[i][j-1];

              如果第j个盒子放苹果:dp[i][j]=dp[i-j][j],相当于在j个盒子中每一个先放一个苹果,然后把剩

                                                  余的i-j个苹果放在j个盒子中;

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 using namespace std;
     6 int t,n,m;
     7 int dp[11][11];
     8 
     9 int main()
    10 {
    11     //freopen("in.txt","r",stdin);
    12     scanf("%d",&t);
    13     while(t--){
    14         scanf("%d%d",&m,&n);
    15         memset(dp,0,sizeof(dp));
    16         for(int i=0;i<=m;i++)
    17             dp[i][0]=1;
    18         for(int i=0;i<=m;i++)
    19             dp[i][1]=1;
    20         for(int i=0;i<=n;i++)
    21             dp[1][i]=1,dp[0][i]=1;
    22         for(int i=2;i<=m;i++)
    23             for(int j=2;j<=n;j++)
    24         {
    25             if(i>=j) dp[i][j]=dp[i][j-1]+dp[i-j][j];
    26             else dp[i][j]=dp[i][i];
    27         }
    28         printf("%d
    ",dp[m][n]);
    29     }
    30     return 0;
    31 }
  • 相关阅读:
    读书笔记—CLR via C#线程25-26章节
    算法回顾--N皇后问题简单回顾
    编程拾趣--集合子集问题
    读书笔记—CLR via C#异常和状态管理
    读书笔记—CLR via C#字符串及文本
    设计模式---抽象工厂
    读书笔记—CLR via C#反射
    读书笔记—CLR via C#委托和attribute
    C#编程实践—EventBroker简单实现
    Linux平台屏幕录像工具RecordMyDesktop
  • 原文地址:https://www.cnblogs.com/codeyuan/p/4280211.html
Copyright © 2011-2022 走看看