简单的整数划分问题

来源:互联网 发布:南风知我意叶小意txt 编辑:程序博客网 时间:2024/05/21 19:04

2:简单的整数划分问题

  • 查看
  • 提交
  • 统计
  • 提问
总时间限制: 
100ms 
内存限制: 
65536kB
描述

将正整数n 表示成一系列正整数之和,n=n1+n2+…+nk, 其中n1>=n2>=…>=nk>=1 ,k>=1 。
正整数n 的这种表示称为正整数n 的划分。正整数n 的不同的划分个数称为正整数n 的划分数。

输入
标准的输入包含若干组测试数据。每组测试数据是一个整数N(0 < N <= 50)。
输出
对于每组测试数据,输出N的划分数。
样例输入
5
样例输出
7
提示

5, 4+1, 3+2, 3+1+1, 2+2+1, 2+1+1+1, 1+1+1+1+1

可以看做完全背包问题,1~n的重量装满n容量的背包的方法有多少种

#include <iostream>#include <algorithm>#include <cstring>#include <cstdio>using namespace std;typedef long long LL;using namespace std;#define INF 0x3f3f3f3f#define mod 1000000007#define N 100int dp[N];int a[N];int main(){    int n;    while(scanf("%d",&n)!=EOF){            memset(dp,0,sizeof(dp));        for(int i=1;i<=n;i++)            a[i]=i;        dp[0]=1;        for(int i=1;i<=n;i++) {            for(int j=a[i];j<=n;j++) {                if(j>=a[i])                    dp[j]=dp[j]+dp[j-a[i]];            }        }        printf("%d\n",dp[n]);    }    return 0;}


原创粉丝点击