完全背包,我想到了,但我没想明白怎么写
先筛选素数,合格的素数做标记,
完全背包是先将一个物品拿满,不是依次拿各个物品
这道题没有价值,把方案数作为价值进行累加,是累加而非替换。思维定势了属于是
#include <bits/stdc++.h>
using namespace std;
int n;
long long dp[1010] ;
int h[1010];
int f(int n) {
if (n == 1 || n == 0)
return 0;
if (n == 2 || n == 3)
return 1;
if (n % 6 != 1 & n % 6 != 5)
return 0;
for (int i = 5; i * i <= n; i += 6) {
if (n % i == 0 || n % (i + 2) == 0)
return 0;
}
return 1;
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
h[i] = f(i); //先把素数都找出来
//dp[h[i]] = 1;
}
dp[0] = 1;
for (int i = 1; i <= n; i++) { //素数是物品
if (h[i])
for (int j = i; j <= n; j++) {//j是背包重量
dp[j] += dp[j - i];
}
}
cout << dp[n];
}