poj1664放苹果
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 33661   Accepted: 20824

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

关键在于找到放的递推关系,要达到不重不露才可!
递推关系就是,对于将n个苹果放在m个盘子里,因为可以有空盘子,
所以会出现两种情况:一:没空盘子出现;二:有空盘子出现
对于一显然每个盘子都至少含有一个苹果,所以此时dp[n][m]=dp[n-m][m];
对于二,dp[n][m]=dp[n][m-1];
最后注意dp数组的初始化 之所以二考虑了所有情况:
假设将5个果子放入3个盘子,在j==2时就已经考虑过了一个盘子是空的情况,所以j==3时考虑一个空盘子的情况也包含了两个都是空的情况

#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m,i,j,k,dp[105][105];
int t;memset(dp,0,sizeof(dp));

for(i=0;i<=100;++i) dp[0][i]=1;
for(i=1;i<=100;++i)
for(j=1;j<=100;++j)
dp[i][j]=dp[i][j-1]+dp[i-j][j];
cin>>t;
while(t--){
cin>>n>>m;
cout<<dp[n][m]<<endl;
}

return 0;
}

递归姿势:

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;

int solve(int n,int m)
{
if(n == 1 || m == 1 || n == 0)
return 1;
if(n<m)
return solve(n,n);
else
return solve(n,m-1)+solve(n-m,m);
}

int main()
{
int t,n,m;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
printf("%d\n",solve(n,m));
}

return 0;
}

由此题引出相似题目,整数划分,求一个整数可以被划分为多少种不同的整数的和

例如:
 如n==6的整数划分为(要求所有的数都小于n)
    
    6
    5 + 1
    4 + 2, 4 + 1 + 1
    3 + 3, 3 + 2 + 1, 3 + 1 + 1 + 1
    2 + 2 + 2, 2 + 2 + 1 + 1, 2 + 1 + 1 + 1 + 1
    1 + 1 + 1 + 1 + 1 + 1

共11种。

仔细想想和放苹果类似,只不过是将n个果子放入n个盘子里!

#include<bits/stdc++.h>
using namespace std;
int solve(int n,int m)
{
if(n==0||m==1||n==1) return 1;
if(n>=m)
return solve(n-m,m)+solve(n,m-1);
else return solve(n,m-1);
}
int main()
{
int n,m;
while(cin>>n) cout<<solve(n,n)<<endl;
return 0;
}

将正整数划分成连续的正整数之和
如15可以划分成4种连续整数相加的形式:
15
7 8
4 5 6
1 2 3 4 5

首先考虑一般的形式,设n为被划分的正整数,x为划分后最小的整数,如果n有一种划分,那么
结果就是x,如果有两种划分,就是x和x x + 1, 如果有m种划分,就是 x 、x x + 1 、 x x + 1 x + 2 、... 、x x + 1 x + 2 ... x + m - 1
将每一个结果相加得到一个公式(i * x + i * (i - 1) / 2) = n,i为当前划分后相加的正整数个数。
满足条件的划分就是使x为正整数的所有情况。
如上例,当i = 1时,即划分成一个正整数时,x = 15, 当i = 2时, x = 7。
当x = 3时,x = 4, 当x = 4时,4/9,不是正整数,因此,15不可能划分成4个正整数相加。
当x = 5时,x = 1。

这里还有一个问题,这个i的最大值是多少?不过有一点可以肯定,它一定比n小。我们可以做一个假设,
假设n可以拆成最小值为1的划分,如上例中的1 2 3 4 5。这是n的最大数目的划分。如果不满足这个假设,
那么 i 一定比这个划分中的正整数个数小。因此可以得到这样一个公式i * (i + 1) / 2 <= n,即当i满足
这个公式时n才可能被划分。

综合上述,源程序如下

int split1(int n)
{
    int i, j, m = 0, x, t1, t2;
   // 在这里i + 1之所以变为i - 1,是因为i * (i - 1) / 2这个式子在下面多次用到,
  // 为了避免重复计算,因此将这个值计算完后保存在t1中。并且将<= 号变为了<号。
    for(i = 1; (t1 = i * (i - 1) / 2) < n; i++) 
    {
        t2 = (n - t1);
        x =  t2 / i;
        if(x <= 0) break;
        if((n - t1) % i == 0)
        {
            printf("%d ", x);
            for(j = 1; j < i; j++)
                printf("%d ", x + j);
            printf("\n");
            m++;
        }
    }
    return m;
}

poj1664 放苹果(DPorDFS)&&系列突破(整数划分)的更多相关文章

  1. [POJ1664]放苹果(动态规划)

    [POJ1664]放苹果 Description 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法. Input 第 ...

  2. poj1664放苹果(递归)

    题目链接:http://poj.org/problem?id=1664 放苹果 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: ...

  3. POJ1664 放苹果 (母函数)

    放苹果 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 37515   Accepted: 23090 Description ...

  4. poj1664 放苹果(递归)

    转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://poj.org/problem?id=1664 ------ ...

  5. [POJ1664] 放苹果 (动态规划,组合数学)

    题目描述 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分发(5,1,1和1,1,5是同一种方法) 输入输出格式 输入格式: 第一行是测试数据的数目t(0 <= ...

  6. POJ1664 放苹果

    #include <iostream> #include <cstdio> #include <cstring> using namespace std; int ...

  7. 放苹果(整数划分变形题 水)poj1664

    问题:把M个相同的苹果放在N个相同的盘子里.同意有的盘子空着不放,问共同拥有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法. 例子 : 1 7 3 ---------------8 ...

  8. POJ1664(整数划分)

    放苹果 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 30894   Accepted: 19504 Description ...

  9. 放苹果(poj1664递归)

    ti放苹果 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 24392   Accepted: 15513 Descripti ...

随机推荐

  1. python中递归调用

    递归一个通俗的解释就是,在函数中调用函数本身:伪代码如下: In [31]: def fun(): ....: fun() # 这个递归没有任何作用,只是为了说明什么是递归 递归(Recursion) ...

  2. assert_param

    在STM32的固件库和提供的例程中,到处都可以见到assert_param()的使用.如果打开任何一个例程中的stm32f10x_conf.h文件,就可以看到实际上assert_param是一个宏定义 ...

  3. grep如何结尾匹配

    答:grep "jello$" 如:git branch输出以下内容: yes-jello-good yes-jellos yes-jello 那么使用以下命令只能过滤出一行: $ ...

  4. Msys2的安装,并整合到cmder中

    下载:msys2-x86_64-20161025.exe 下载安装包,然后装上. 打开msys的shell之后首先升级一下pacman,然后就可以愉快地Syu了. $ pacman -Sy pacma ...

  5. 【Maven】2.使用Nexus3搭建Maven私服+上传第三方jar包到本地maven仓库

    参考文章: http://www.cnblogs.com/luotaoyeah/p/3791966.html --------------------------------------------- ...

  6. [Shiro] - 基于URL配置动态权限

    基于shiro进阶 更改了数据库表 之前的PageController是通过@RequiresPermissions和@RequiresRoles进行是否有权限/是否有角色的判定调用@RequestM ...

  7. FOJ-1001-Duplicate Pair

    题目:Duplicate Pair 大意: 有多组测试数据,输入整数n,接着输入n个整数(integers),这些数字几乎都只出现一次,但其中有一个数出现了两次,请输出这个数. 题解: 大数据问题,普 ...

  8. HDU 1083 Courses(二分图匹配模板)

    http://acm.hdu.edu.cn/showproblem.php?pid=1083 题意:有p门课和n个学生,每个学生都选了若干门课,每门课都要找一个同学来表演,且一个同学只能表演一门课,判 ...

  9. Perl 获得当前路径

      1.有两种方法:1. use Cwd;my $dir = getcwd;#$dir中即为当前目录的完整路径信息.2. my $dir = $ENV{'PWD'};#ENV是一个散列,用于存放环境变 ...

  10. python datetime模块来获取当前的日期和时间

    #!/usr/bin/python # -*- coding: UTF- -*- import datetime i = datetime.datetime.now() print ("当前 ...