首页 > 其他 > 详细

洛谷P1832 A+B Problem(再升级) 题解 完全背包方案计数

时间:2019-12-12 09:55:13      阅读:118      评论:0      收藏:0      [点我收藏+]

题目链接:https://www.luogu.com.cn/problem/P1832

题目大意:
给定一个正整数n,求将其分解成若干个素数之和的方案总数。

解题思路:

  • 首先找到所有 \(\le n\) 的素数;
  • 将问题转换成一个容量为 \(n\) 的背包,以及若干件体积和价值相同的物品,他们对应求出来的所有素数。
  • 求完全背包方案数

代码实现:

  • 是开始素数筛法求出所有符合要求的素数;
  • 然后完全背包计数

实现代码如下:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1010;
int n, p[maxn], cnt;
long long f[maxn];
bool np[maxn];
void init() {
    for (int i = 2; i <= n; i ++) {
        if (!np[i]) {
            p[cnt++] = i;
            for (int j = i; j <= n/i; j ++) {
                np[i*j] = true;
            }
        }
    }
}
void comp_pack(int c) {
    for (int i = c; i <= n; i ++) f[i] += f[i-c];
}
int main() {
    cin >> n;
    init();
    f[0] = 1;
    for (int i = 0; i < cnt && p[i] <= n; i ++)
        comp_pack(p[i]);
    cout << f[n] << endl;
    return 0;
}

洛谷P1832 A+B Problem(再升级) 题解 完全背包方案计数

原文:https://www.cnblogs.com/quanjun/p/12027152.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!