Integer division 1
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
整数划分是一个非常经典的数学问题。
所谓整数划分,是指把一个正整数n写成为n=m1+m2+...+mi的形式,其中mi为正整数,并且1<=mi<=n,此时,{m1, m2, ..., mi}为n的一个划分。如果{m1, m2, ..., mi}中的最大值不超过m,即max{m1, m2, ..., mi}<=m,那么我们称之为整数n的一个m划分。
现在给出你正整数n和m,请你输出n的m划分的数量。
例如,当n=4时,有5个划分,即{4}, {3,1}, {2,2}, {2,1,1}, {1,1,1,1}。
注意,4=1+3和4=3+1被认为是同一个划分。
输入
输入文件以EOF结束。
每组数据占一行,有两个正整数n和m。(n,m<=50)
输出
输出n的m划分的数量。
示例输入
4 4
示例输出
5
这是完全背包题
#include <stdio.h>
#include <string.h>
int main()
{
int i,j,n,m,dp[100];
while(scanf("%d %d",&n,&m)!=EOF)
{
memset(dp,0,sizeof(dp));
dp[0]=1;//边界都初始化为1,具体为啥 就相当于为什么0!=1;
for(i=1;i<=m;i++)//枚举
for(j=0;j<=n;j++)//相当于容量
{
if(j>=i)
dp[j]=dp[j-i]+dp[j];
}
printf("%d\n",dp[n]);
}
return 0;
}