题意:有数字n,m
1-m的数字(数字个数无限制)可以组成多少个n
完全背包
dp[j]=dp[j]+dp[i-j];
注意大数,刚开始没有写前导0,WA了一次
View Code
#include<stdio.h>
#include<string.h>
const int MOD=100000000;
struct data
{
int s[9];
}dp[1009];
data add(data a,data b)
{
int i=0;
data ret;
ret.s[i]=(a.s[i]+b.s[i])%MOD;
for(i=1;i<9;i++)
{
ret.s[i]=(a.s[i]+b.s[i]+(a.s[i-1]+b.s[i-1])/MOD)%MOD;
a.s[i]+=(a.s[i-1]+b.s[i-1])/MOD;
}
return ret;
}
void show(data a)
{
int i=8;
while(a.s[i]==0) i--;
int k=i,j,add;
for(;i>=0;i--)
{
if(k==i)
printf("%d",a.s[i]);
else
{
add=0;
int temp=a.s[i];
while(temp!=0)
{
add++;
temp/=10;
}
add=8-add;
while(add--)printf("0");
printf("%d",a.s[i]);
}
}
printf("\n");
}
int max(int a,int b)
{
if(a>b)return a;
else return b;
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
int i,j;
memset(dp,0,sizeof(dp));
dp[0].s[0]=1;
for(i=1;i<=m;i++)
{
for(j=i;j<=n;j++)
{
dp[j]=add(dp[j],dp[j-i]);
}
}
show(dp[n]);
}
return 0;
}