067_划分数

来源:互联网 发布:深圳java薪水 编辑:程序博客网 时间:2024/06/06 11:01

  有n个无差别物品,划分成不超过m组,求划分的方案个数。

  此类DP 问题定义如下:

      dp[i][j]=j个物品的i划分的总数。

 DP的时候分两部分讨论:如果划分没有某一组是空的,即正好划分成i组,所以每组至少可以拿出一个物品,即为dp[i][j-i]。

 或者至少有一组是空的,即其划分数为dp[i-1][j];

  so, dp[i][j]=dp[i][j-i]+dp[i-1][j]

 注意初始化的问题。当0个物品划分成0组时,只有一种划分方案;当0个物品划分成i(i>=1)组时,不存在方案,为0;

 《挑战程序竞赛》第二版67页貌似程序初始化有误,其程序运行结果貌似不正确。


 上代码:


////  067_stirling num.cpp//  changlle////  Created by user on 12/29/15.//  Copyright (c) 2015 user. All rights reserved.//#include <iostream>#include <algorithm>using namespace std;int n=4;int m=3;int M=10000;int main() {        int dp[4][5];        dp[0][0]=1;    for (int j=1;j<=n;j++)       dp[0][j]=0;        for (int i=1;i<=m;i++)        for (int j=0;j<=n;j++)        {                        if (j-i>=0)                dp[i][j]=dp[i][j-i]+dp[i-1][j];            else                dp[i][j]=dp[i-1][j];        }        for (int i=0;i<=m;i++)    {        for (int j=0;j<=n;j++)            cout<<dp[i][j]<<"   ";        cout<<endl;                }        cout<<dp[m][n]<<endl;                    return 0;}


0 0
原创粉丝点击