uva 1213 不同素数之和
2015-09-09 00:19
337 查看
题意:
选择K个质数使它们的和为N,求总的方案数。
分析:
虽然知道推出来了转移方程, 但还是没把代码敲出来,可能基本功还是不够吧。
d(i, j)表示i个素数的和为j的方案数,则 d(i, j) = sigma d(i-1, j-p[k]) ,其中p[k]表示第k个素数
注意递推的顺序是倒着推的,否则会计算重复的情况。
代码中第二重和第三重循环的顺序可互换。
// Created by Chenhongwei in 2015.
// Copyright (c) 2015 Chenhongwei. All rights reserved.
#include "iostream"
#include "cstdio"
#include "cstdlib"
#include "cstring"
#include "climits"
#include "queue"
#include "cmath"
#include "map"
#include "set"
#include "stack"
#include "vector"
#include "sstream"
#include "algorithm"
using namespace std;
const int inf=1e8;
const int maxn=1120;
typedef long long ll;
int cnt=0;
int p[5000],dp[maxn+10][20];
int main()
{
//ios::sync_with_stdio(false);
// freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
for(int i=2;i<=maxn;i++)
{
int flag=1;
for(int j=2;j*j<=i;j++)
if(i%j==0)
{
flag=0;
break;
}
if(flag)p[++cnt]=i;
}
memset(dp,0,sizeof dp);
dp[0][0]=1;
for(int i=1;i<=cnt;i++)
for(int j=14;j>=1;j--)
for(int k=maxn;k>=p[i];k--)
dp[k][j]+=dp[k-p[i]][j-1];
int n,m;
while(cin>>n>>m&&(n+m))
cout<<dp
[m]<<endl;
return 0;
}
选择K个质数使它们的和为N,求总的方案数。
分析:
虽然知道推出来了转移方程, 但还是没把代码敲出来,可能基本功还是不够吧。
d(i, j)表示i个素数的和为j的方案数,则 d(i, j) = sigma d(i-1, j-p[k]) ,其中p[k]表示第k个素数
注意递推的顺序是倒着推的,否则会计算重复的情况。
代码中第二重和第三重循环的顺序可互换。
// Created by Chenhongwei in 2015.
// Copyright (c) 2015 Chenhongwei. All rights reserved.
#include "iostream"
#include "cstdio"
#include "cstdlib"
#include "cstring"
#include "climits"
#include "queue"
#include "cmath"
#include "map"
#include "set"
#include "stack"
#include "vector"
#include "sstream"
#include "algorithm"
using namespace std;
const int inf=1e8;
const int maxn=1120;
typedef long long ll;
int cnt=0;
int p[5000],dp[maxn+10][20];
int main()
{
//ios::sync_with_stdio(false);
// freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
for(int i=2;i<=maxn;i++)
{
int flag=1;
for(int j=2;j*j<=i;j++)
if(i%j==0)
{
flag=0;
break;
}
if(flag)p[++cnt]=i;
}
memset(dp,0,sizeof dp);
dp[0][0]=1;
for(int i=1;i<=cnt;i++)
for(int j=14;j>=1;j--)
for(int k=maxn;k>=p[i];k--)
dp[k][j]+=dp[k-p[i]][j-1];
int n,m;
while(cin>>n>>m&&(n+m))
cout<<dp
[m]<<endl;
return 0;
}
相关文章推荐
- 工作中感受到的消息中间件在分布式系统中的使用场景
- mysql函数之——控制流函数
- Ibatis和myIbatis 返回插入的主键ID
- zookeeper集群安装配置
- poj 2464(区间更新)
- Unity3D占用内存太大的解决方法
- 【Android】2015.09.08 第一行代码 Day6 Count:8
- PE格式详细讲解10 – 基址重定位
- 使用Python与openpyxl进行表格处理(一)——读取数据
- uva 11526 H(n)
- ps笔记
- 一元线性回归(原理)
- XML解析技术之VTD-XML 简介及代码实例
- Sbt仓库设置
- 复制文件夹内 所有文件 到另一个文件夹!!
- dig命令
- Mysql 的左连接与右连接区别
- 我的导航
- 控制器管理
- 以前写的一段aop,远程接口调用的日志。