标签:
要细细理解
本题是完全背包,因为素数可以重复出现;若不能重复出现,则是01背包。
1 #include <iostream> 2 #include <stdio.h> 3 #include <math.h> 4 using namespace std; 5 6 int Pri[150]; 7 int dp[155]; 8 int cnt; 9 10 11 void Prime() 12 //枚举所有素数 13 { 14 int i,k,j; 15 cnt=0; 16 Pri[cnt++]=2; 17 for(i=3;i<=150;i++) 18 { 19 k=(int)sqrt(double(i)); 20 for(j=2;j<=k;j++) 21 if(i%j==0)break; 22 if(j>k)Pri[cnt++]=i; 23 } 24 } 25 26 void Solve1() 27 //素数能重复出现的情况 28 { 29 int i,j; 30 memset(dp,0,sizeof(dp)); 31 32 dp[0]=1; 33 34 for(i=0;i<cnt;i++) 35 { 36 for(j=Pri[i];j<=150;j++) 37 { 38 dp[j]+=dp[j-Pri[i]]; 39 } 40 } 41 } 42 43 void Solve2() 44 //素数不能重复出现的情况 45 { 46 int i,j; 47 memset(dp,0,sizeof(dp)); 48 49 dp[0]=1; 50 51 for(i=0;i<cnt;i++) 52 { 53 for(j=150;j>=Pri[i];j--) 54 { 55 dp[j]+=dp[j-Pri[i]]; 56 } 57 } 58 } 59 60 61 int main() 62 { 63 int n,cas; 64 Prime(); 65 Solve1(); 66 cin>>cas; 67 while(cas--) 68 { 69 scanf("%d",&n); 70 printf("%d\n",dp[n]); 71 } 72 return 0; 73 }
标签:
原文地址:http://www.cnblogs.com/wangmengmeng/p/4708197.html