博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SGU 116 Index of super-prime
阅读量:7041 次
发布时间:2019-06-28

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

SGU_116

    一开始用回溯写了一下,发现效率还是很高的,但需要注意不是当前选择的越大就一定越好。

    后来看了别人的题解提到了dp的解法,于是便又用dp写了一下,用f[i]表示i最少可以分解为几个超级素数之和,同时用fa[]记录下决策的过程即可。

//回溯 #include
#include
#define MAXD 10010 #define INF 0x3f3f3f3f int N, isprime[MAXD], prime[MAXD], p, sprime[MAXD], sp, a[MAXD], ans[MAXD], num; void prepare() {
int i, j, k; memset(isprime, -1, sizeof(isprime)); p = 0; for(i = 2; i <= 10000; i ++) if(isprime[i]) {
prime[++ p] = i; for(j = i * i; j <= 10000; j += i) isprime[j] = 0; } sp = 0; for(i = 2; i <= p; i ++) if(isprime[i]) sprime[++ sp] = prime[i]; } void dfs(int t, int cur, int s) {
int i, j; if(cur >= num) return ; if(s == 0) {
num = cur; for(i = 0; i < cur; i ++) ans[i] = a[i]; return ; } for(i = t; i > 0; i --) if(s >= sprime[i]) {
a[cur] = sprime[i]; dfs(i, cur + 1, s - sprime[i]); } } void solve() {
int i, j ,k; num = 0x3f3f3f3f; dfs(sp, 0, N); if(num == INF) printf("0\n"); else {
printf("%d\n", num); printf("%d", ans[0]); for(i = 1; i < num; i ++) printf(" %d", ans[i]); printf("\n"); } } int main() {
int i, j, k; prepare(); while(scanf("%d", &N) == 1) {
solve(); } return 0; }

 

//dp #include
#include
#include
#define MAXD 10010 #define INF 0x3f3f3f3f int N, isprime[MAXD], prime[MAXD], p, sprime[MAXD], sp, a[MAXD], ans[MAXD], num, f[MAXD], fa[MAXD]; int cmp(const void *_p, const void *_q) {
int *p = (int *)_p; int *q = (int *)_q; return *q - *p; } void prepare() {
int i, j, k; memset(isprime, -1, sizeof(isprime)); p = 0; for(i = 2; i <= 10000; i ++) if(isprime[i]) {
prime[++ p] = i; for(j = i * i; j <= 10000; j += i) isprime[j] = 0; } sp = 0; for(i = 2; i <= p; i ++) if(isprime[i]) sprime[++ sp] = prime[i]; memset(f, 0x3f, sizeof(f)); f[0] = 0; for(i = 1; i <= 10000; i ++) for(j = 1; j <= sp && sprime[j] <= i; j ++) if(f[i - sprime[j]] + 1 < f[i]) {
f[i] = f[i - sprime[j]] + 1; fa[i] = i - sprime[j]; } } void solve() {
int i, j ,k; num = 0x3f3f3f3f; if(f[N] == INF) printf("0\n"); else {
for(i = N, k = 0; i != 0; i = fa[i]) ans[k ++] = i - fa[i]; qsort(ans, k, sizeof(ans[0]), cmp); printf("%d\n", k); printf("%d", ans[0]); for(i = 1; i < k; i ++) printf(" %d", ans[i]); printf("\n"); } } int main() {
int i, j, k; prepare(); while(scanf("%d", &N) == 1) {
solve(); } return 0; }

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

你可能感兴趣的文章
linux下简单的自适应CPU利用率的控制(Python实现)
查看>>
【VMware混合云】应用为王
查看>>
vi中的正则表达式
查看>>
【SQL Server】ID函数排序
查看>>
销售C#版代码生成器 - 支持PowerDesigner设计文档
查看>>
读Linux那些事儿之我是U盘笔记(七)
查看>>
详细图解SharePoint 2007部署和配置过程
查看>>
centos7 基于pxe安装系统
查看>>
节假日批量设置的C#.NET程序代码参考 荐
查看>>
Vim键盘布局
查看>>
Exchange2010管理控制台无法安装
查看>>
android用户界面-组件Widget-网络视图WebView
查看>>
KVM 存储虚拟化 - 每天5分钟玩转 OpenStack(7)
查看>>
iAMT无法连接,该怎么办?
查看>>
lintcode二叉树的锯齿形层次遍历 (双端队列)
查看>>
ADSL技术概述
查看>>
CentOS下NFS服务器配置实例
查看>>
RHEL5.4部署中央日志服务器之rsyslog+loganalyzer
查看>>
酷派7728软件安装到外置SD卡上的方法,也适用于联想s850e等
查看>>
步步为营VS 2008 + .NET 3.5(10) - DLINQ(LINQ to SQL)之调用存储过程的添加、查询、更新和删除...
查看>>