首先这个不是一个dp,可以用简单的dfs爆搜
dp的要求f(i,j) 其实i表示看到第i个数字,而不是选了i个数字,j表示的为具体情况。
也即 看到第i个数字,此时和为j的情况,
但dp要求是拿随意数量的物品,若规定物品则很难表示,所以这个并非dp
逻辑运算符别写错emm
#include <bits/stdc++.h>
using namespace std;
int n, k;
int a[100];
int num = 0;
int i, j;
int sum = 0;
int ans = 0;
int flag;
int sushu(int x) {
if (x == 0)
return 0;
if (x == 1)
return 0;
if (x == 2 || x == 3)
return 1;
if (x % 6 != 1 && x % 6 != 5)
return 0;
for (i = 5; i * i <= x; i += 6) {
if (x % i == 0 || x % (i + 2) == 0)
return 0;
}
return 1;
}
int dfs(int x) { //x表示搜索到第几个数字 num表示添加了几个数字
if (x > n && num > k)
return 0;
sum += a[x];
num++;
if (num < k) {
dfs(x + 1);
sum -= a[x];
num--;
dfs(x + 1);
}
if (num == k) {
flag = sushu(sum);
if (flag) {
ans++;
num--;
sum -= a[x];
dfs(x + 1);
} else {
sum -= a[x];
num--;
dfs(x + 1);
}
}
return 0;
}
int main() {
cin >> n >> k;
for (i = 1; i <= n; i++) {
cin >> a[i];
}
dfs(1);
cout << ans;