博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj3132
阅读量:5928 次
发布时间:2019-06-19

本文共 1628 字,大约阅读时间需要 5 分钟。

dp,f[i][j][k]表示用i个不同的素数相加等于k的方法数,且这i个素数只能在前j个数字中选。

f[i][j][k] = f[i][j - 1][k] + f[i - 1][j - 1][k - w[j]];(w[j]为第j个素数的值)

View Code
#include 
#include
#include
#include
#include
using namespace std;#define maxn 1200#define maxr 20bool is[maxn];int prm[maxn];int n, r, tot;int f[maxr][maxn][maxn];int w[maxn];int getprm(int n){ int i, j, k = 0; int s, e = (int) (sqrt(0.0 + n) + 1); memset(is, 1, sizeof(is)); prm[k++] = 2; is[0] = is[1] = 0; for (i = 4; i < n; i += 2) is[i] = 0; for (i = 3; i < e; i += 2) if (is[i]) { prm[k++] = i; for (s = i * 2, j = i * i; j < n; j += s) is[j] = 0; } for (; i < n; i += 2) if (is[i]) prm[k++] = i; return k;}int work(){ int i = 0; while (i < tot && prm[i] <= n) i++; int m = i; memset(w, 0, sizeof(w)); for (int i = 0; i < m; i++) w[i + 1] = prm[i]; for (int i = 0; i <= m; i++) f[0][i][0] = 1; for (int i = 1; i <= r; i++) { for (int j = 1; j <= m; j++) for (int k = 0; k <= n; k++) { f[i][j][k] = f[i][j - 1][k]; if (k - w[j] >= 0) f[i][j][k] += f[i - 1][j - 1][k - w[j]];// if (f[i][j][k])// printf("%d %d %d %d\n", i, w[j], k, f[i][j][k]); } } return f[r][m][n];}int main(){ //freopen("t.txt", "r", stdin); tot = getprm(1120); while (scanf("%d%d", &n, &r), n | r) printf("%d\n", work()); return 0;}

转载地址:http://qnevx.baihongyu.com/

你可能感兴趣的文章
2019.2.20 c++ 知识梳理
查看>>
98. Validate Binary Search Tree
查看>>
DOM 元素中的焦点管理
查看>>
分享一些好用的网站
查看>>
SAP R/3系统的R和3分别代表什么含义,负载均衡的实现原理
查看>>
第十二课时:渲染函数和JSX快速掌握
查看>>
聊聊flink的MemorySegment
查看>>
学习JavaScript循环下的async/await
查看>>
30秒的PHP代码片段(3)字符串-String & 函数-Function
查看>>
介紹敏捷方法: Scrum, Kanban or Lean?
查看>>
Web前端开发过程踩过的坑以及一些小方法技巧(持续更新)
查看>>
力扣(LeetCode)31
查看>>
vue JS 对象赋值
查看>>
快速体验 Sentinel 集群限流功能,只需简单几步
查看>>
web前端开发项目资源网站,私家珍藏!
查看>>
原型链
查看>>
241. Different Ways to Add Parentheses
查看>>
Objective-C 中关联引用的概念
查看>>
JavaScript 如何使用闭包
查看>>
小程序开发之影分身术
查看>>