1 /* 2 类似完全背包,容量为n的背包用素数填,求满背包的种数 3 dp(i,j)表示用不超过i的素数组成的j的种数 4 dp[i][j]=dp[i-1][j],若i为素数则dp[i][j]+=dp[i][j-i] 5 */ 6 #include <iostream> 7 #include <cstdio> 8 #include <cstring> 9 using namespace std; 10 11 const int maxn=155; 12 int prime[maxn],flag[maxn],num; 13 int dp[maxn][maxn]; 14 15 void getprimes() 16 { 17 num=0;memset(flag,1,sizeof(flag)); 18 for(int i=2;i<=maxn;i++) 19 { 20 if(flag[i]) prime[num++]=i; 21 for(int j=0;j<=num && prime[j]*i<maxn;j++) 22 { 23 flag[prime[j]*i]=false; 24 if(i%prime[j]==0) break; 25 } 26 } 27 } 28 29 int main() 30 { 31 getprimes(); 32 int t,n,i,j,ans; 33 scanf("%d",&t); 34 while(t--) 35 { 36 scanf("%d",&n); 37 memset(dp,0,sizeof(dp)); 38 dp[1][0]=1; 39 for(i=2;i<=n;i++) 40 { 41 for(j=0;j<=n;j++) 42 dp[i][j]=dp[i-1][j]; 43 if(!flag[i]) continue; 44 for(j=i;j<=n;j++) 45 dp[i][j]+=dp[i][j-i]; 46 } 47 printf("%d\n",dp[n][n]); 48 } 49 return 0; 50 }
时间: 2024-10-12 13:24:08