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

本文共 1738 字,大约阅读时间需要 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;}

转载于:https://www.cnblogs.com/rainydays/archive/2012/07/06/2579031.html

你可能感兴趣的文章
Linux的任务调度
查看>>
在Android studio中添加jar包方法如下
查看>>
iframe 在ie下面总是弹出新窗口解决方法
查看>>
分享10款漂亮实用的CSS3按钮
查看>>
安装nginx 常见错误及 解决方法
查看>>
Gorun8电子商城
查看>>
在之前链表的基础上改良的链表
查看>>
android编译系统makefile(Android.mk)写法
查看>>
MD5源代码C++
查看>>
Eclipse 添加 Ibator
查看>>
Linux中变量$#,$@,$0,$1,$2,$*,$$,$?的含义
查看>>
Python编程语言
查看>>
十四、转到 linux
查看>>
Got error 241 'Invalid schema
查看>>
ReferenceError: event is not defined
查看>>
男人要内在美,更要外在美
查看>>
为什么要跟别人比?
查看>>
app启动白屏
查看>>
Oracle 提高查询性能(基础)
查看>>
学习知识应该像织网一样去学习——“网状学习法”
查看>>