划分型dp

来源:互联网 发布:warframe淘宝白金 编辑:程序博客网 时间:2024/06/01 09:27

1m个同样的苹果放在n个同样的盘子里,允许有的盘子空着不放,问有多少种不同的分法。

#include<iostream>#include<string.h>using namespace std; int dp[20][20]={0};int m,n; int main(){    int t;    cin>>t;    while(t--){        memset(dp,0,sizeof(dp));        cin>>m>>n;         //题目中的i和j都是有实际意义的,不能for(int i=0;i<n;i++)        //0个苹果,就一种放法        for(int i=1;i<=n;i++){            dp[0][i]=1;        }        //1个盘子,就一种放法,不能有0个盘子        for(int i=1;i<=m;i++){            dp[i][1]=1;        }         for(int i=1;i<=m;i++){            for(int j=1;j<=n;j++){                //盘子比苹果多,没用                if(j>i) dp[i][j]=dp[i][i];                //盘子比苹果少,可以先每个盘子都放一个,dp[i-j]][i];                //也可以这个盘子空着,dp[i][j-1]                else dp[i][j]=dp[i-j][j]+dp[i][j-1];            }        }         cout<<dp[m][n]<<endl;     }     return 0;}


2m个同样的苹果放在n个同样的盘子里,不允许有的盘子空着不放,问有多少种不同的分法。

相似问题:数的划分

题目描述 Description

将整数n分成k份,且每份不能为空,任意两种划分方案不能相同(不考虑顺序)。
例如:n=7,k=3,下面三种划分方案被认为是相同的。
1 1 5

1 5 1

5 1 1
问有多少种不同的分法。

输入描述 Input Description

输入:n,k (6<n<=200,2<=k<=6)

输出描述 Output Description


输出:一个整数,即不同的分法。

样例输入 Sample Input

 7 3

样例输出 Sample Output

4

#include<iostream>#include<string.h>#include<stdio.h>using namespace std;int dp[201][10];int k,n;int main(){    cin>>n>>k;    memset(dp,0,sizeof(dp));    for(int i=1;i<=n;i++){        dp[i][1]=1;    }    /*绝对不能这样初始化,因为不允许有空盘子    for(int i=1;i<=n;i++){        dp[0][i]=1;    }    */    //0个盘子,0个苹果,肯定是1    dp[0][0]=1;    for(int i=1;i<=n;i++){        for(int j=1;j<=k;j++){            //要是盘子比苹果多了,那么肯定有盘子是空的,不符合要求            if(j>i)continue;            dp[i][j]=dp[i-j][j]+dp[i-1][j-1];        }    }    cout<<dp[n][k]<<endl;    return 0;}