完全背包, 只不过是求最大的方案数 状态转移方程 f[i][j] =sum( f[i-1][j] , f[i][j-i] ) 只是类似背包用一维表示而已, 变为了 f[i]+= f[j-i] 了
而,结果可能__int64都无法容纳 , 故,需要自己写函数解决 详见 代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#define PI acos(-1.0)
#define max(a,b) (a)>(b)? (a):(b)
#define min(a,b) (a)>(b)? (b):(a)
#define INT_MIN -0x7FFFFFFF
#define INT_MAX 0x7FFFFFFF
int f[1005][50];
int n,k;
void add(int x,int y)
{
int i,j;
i=0;
for(i=0;i<40;i++)
{
f[x][i]+=f[y][i];
if(f[x][i]>=10)
{
f[x][i+1]+=f[x][i]/10;
f[x][i]%=10;
}
}
}
int main()
{
// freopen("in.txt","r",stdin);
int i,j,k;
while(scanf("%d%d",&n,&k)!=EOF)
{
memset(f,0,sizeof(f));
f[0][0]=1;
for(i=1;i<=k;i++)
{
for( j=i;j<=n;j++)
{
add(j,j-i);
}
}
i=40;
while(f[n][i]==0)
i--;
for(j=i;j>=0;j--) printf("%d",f[n][j]);
puts("");
}
return 0;
}