雕刻时光

just do it……nothing impossible
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

完全背包——poj 3181

Posted on 2012-01-13 14:54  huhuuu  阅读(254)  评论(0编辑  收藏  举报

题意:有数字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;
}