https://www.luogu.com.cn/problem/P2563
完全背包。
预处理出来 (200) 以内的素数。
以每个素数为物品进行背包。
时间复杂度:(O(200 imes sqrt{200}+200 imes frac{200}{ln 200}+T)approx O(10576))。
#include <bits/stdc++.h>
using namespace std;
int n,dp[210];
int zs[210],tot;
bool prime(int x) {
for(int i=2;i*i<=x;i++)
if(x%i==0)
return 0;
return 1;
}
int main() {
for(int i=2;i<=200;i++)
if(prime(i))
zs[++tot]=i;//最为暴力的素数筛法
dp[0]=1;
for(int i=1;i<=tot;i++)
for(int j=zs[i];j<=200;j++)
dp[j]+=dp[j-zs[i]];//完全背包
while(scanf("%d",&n)==1)
printf("%d
",dp[n]);//O(1) 回答
}