题目:给你一个数n,求他的不超过k个因数的素数拆分。
分析:dp,二维01背包。整数拆分就会想到dp。
首先,打表计算素数;然后,01背包即可。
说明:大黄的三维DP不管是时间还是空间都不如这个,(*^__^*) 嘻嘻…… 。(2011-09-28 02:15)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int f[ 1121 ][ 15 ];
int prime[ 188 ];
int used[ 1121 ];
int madelist()
{
memset( used, 0, sizeof( used ) );
int count = 0;
for ( int i = 2 ; i <= 1120 ; ++ i )
if ( !used[ i ] ) {
prime[ ++ count ] = i;
for ( int j = 2*i ; j <= 1120 ; j += i )
used[ j ] = 1;
}
return count;
}
int main()
{
int count = madelist();
memset( f, 0, sizeof( f ) );
f[ 0 ][ 0 ] = 1;
for ( int i = 1 ; i <= count ; ++ i ) {
for ( int l = 14 ; l >= 1 ; -- l )
for ( int j = 1120 ; j >= prime[ i ] ; -- j )
f[ j ][ l ] += f[ j-prime[ i ] ][ l-1 ];
}
int n,k;
while ( scanf("%d%d",&n,&k) && n )
printf("%d\n",f[ n ][ k ]);
return 0;
}