传送门:POJ 3181
题意:给出两个数n,k,问由1到k的整数有多少种方法能够组成数n。
题解:完全背包,由于结果过大要用一下高精度。
当n=1000,k=100时的结果:15658181104580771094597751280645
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
__int64 a[1005],b[1005],t;
int main()
{
int i,j,n,k;
while(cin>>n>>k)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
for(i=0,t=1;i<18;i++) t*=10;
for(i=1,a[0]=1;i<=k;i++)
for(j=i;j<=n;j++)
{
b[j]=b[j]+b[j-i]+(a[j]+a[j-i])/t;//数组b保存结果的前一部分,数组a保存结果的后一部分
a[j]=(a[j]+a[j-i])%t;
}
if(b[n]) cout<<b[n];cout<<a[n]<<endl;
}
return 0;
}