洛谷 P1832 A+B Problem(再升级) 题解
题目链接
思路分析
这题同前几题一样,物体的重量与价值相同,只是需要我们自己寻找物品。由于问的是拆分成若干质数的和,所以应为完全背包求方案数,物品即为小于 \(n\) 的所有质数,遍历枚举即可。
另外题目中为求方案数,考虑原本 \(dp_j\) 可以由 \(dp_{j-a_i}\) 转移而来,那么现在根据加法原理,设 \(dp_j\) 表示物体价值和为 \(j\) 的方案数,则 \(dp_j=\sum{dp_{j-a_i}}\),代码时间复杂度 \(O(n^2\sqrt{n})\)。
代码呈现
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e3+10;
int n;
ll dp[N];
bool isPrime(int x){
for (int i=2;i*i<=x;++i){
if (x%i==0) return 0;
}
return 1;
}
int main(){
scanf("%d",&n);
dp[0]=1;
for (int i=2;i<=n;++i){
if (isPrime(i)){
for (int j=i;j<=n;++j) dp[j]+=dp[j-i];
}
}
printf("%lld",dp[n]);
return 0;
}

浙公网安备 33010602011771号