UVA 1213 Sum of Different Primes(经典dp)
题意:选择k(k<15)个唯一质数,求出和为n(n<1121)的可能数
题解:预处理dp,dp[k][n]表示使用k个素数拼成n的总方案数
就是三重枚举,枚举k,枚举n,枚举小于n的素数
但是注意三重循环的顺序与位置,我们要防重防漏
第一重循环是枚举每个小于n的素数,思路是对于每个素数放入dp里面的位置
第二重倒叙枚举每个数n,倒序是类似01背包不能让枚举的素数重复加入同一个dp数组中
第三重正序枚举个数k只能放在最里面,这样才不会出现重复
- import java.util.Scanner;
- public class Main{
- static int Max = 1200;
- static int Maxk = 15;
- static long[][] dp = new long[Maxk][Max];
- static int[] vis = new int[Max];
- static int[] prm = new int[Max];//存所有素数
- static int coun;
- static {
- for (int i = 2; i < Max; ++i) {
- if (vis[i] == 0) {
- for (int j = i + i; j < Max; j += i) {
- vis[j] = 1;
- }
- }
- }
- for (int i = 2; i < Max; ++i) {
- if (vis[i] == 0) {
- prm[coun++] = i;
- }
- }
- }
- private static void Init(int n) {
- dp[0][0]=1;
- // 预处理dp
- //注意三重循环位置,用于去重
- for (int k = 0; k < coun; ++k) {//枚举每个素数
- for (int j = Max-1; j >=prm[k]; --j) {//倒叙枚举每个数,类似01背包去重
- for (int i = 1; i < Maxk; ++i) {//枚举个数
- dp[i][j] += dp[i - 1][j - prm[k]];
- }
- }
- }
- }
- public static void main(String[] args) {
- Init(Max);
- int n, k;
- Scanner sc = new Scanner(System.in);
- while (sc.hasNext()) {
- n = sc.nextInt();
- k = sc.nextInt();
- if (n + k == 0)
- break;
- System.out.println(dp[k][n]);
- }
- }
- }
UVA 1213 Sum of Different Primes(经典dp)的更多相关文章
- UVa 1213 Sum of Different Primes (DP)
题意:给定两个数 n 和 k,问你用 k 个不同的质数组成 n,有多少方法. 析:dp[i][j] 表示 n 由 j 个不同的质数组成,然后先打表素数,然后就easy了. 代码如下: #pragma ...
- UVA - 1213 Sum of Different Primes (不同素数之和)(dp)
题意:选择k个质数,使它们的和等于n,问有多少种方案. 分析:dp[i][j],选择j个质数,使它们的和等于i的方法数. #pragma comment(linker, "/STACK:10 ...
- UVA 1213 Sum of Different Primes
https://vjudge.net/problem/UVA-1213 dp[i][j][k] 前i个质数里选j个和为k的方案数 枚举第i个选不选转移 #include<cstdio> # ...
- UVA 1213 - Sum of Different Primes(递推)
类似一个背包问题的计数问题.(虽然我也不记得这叫什么背包了 一开始我想的状态定义是:f[n = 和为n][k 个素数]. 递推式呼之欲出: f[n][k] = sigma f[n-pi][k-1]. ...
- UVA 674 Coin Change 换硬币 经典dp入门题
题意:有1,5,10,25,50五种硬币,给出一个数字,问又几种凑钱的方式能凑出这个数. 经典的dp题...可以递推也可以记忆化搜索... 我个人比较喜欢记忆化搜索,递推不是很熟练. 记忆化搜索:很白 ...
- HDU 1003 Max Sum --- 经典DP
HDU 1003 相关链接 HDU 1231题解 题目大意:给定序列个数n及n个数,求该序列的最大连续子序列的和,要求输出最大连续子序列的和以及子序列的首位位置 解题思路:经典DP,可以定义 ...
- POJ 3132 & ZOJ 2822 Sum of Different Primes(dp)
题目链接: POJ:id=3132">http://poj.org/problem?id=3132 ZOJ:http://acm.zju.edu.cn/onlinejudge/show ...
- poj 1050 To the Max 最大子矩阵和 经典dp
To the Max Description Given a two-dimensional array of positive and negative integers, a sub-rect ...
- 【经典dp 技巧】8.13序列
经典的拆绝对值 题目大意 给定$n$个具有顺序的序列,允许对每个序列循环移动.记第$i$个序列尾元素为$x$,$i+1$个序列首元素为$y$,定义其连接收益为$|x-y|*i$,求$n$个序列连接最大 ...
随机推荐
- 与python的第一次邂逅
python简介 一.什么是python python是一种面向对象.直译式的计算机程序语言,所以有了武老师的那句名言:一切皆为对象 python的设计哲学是:“优雅”,“明确”,“简单” pytho ...
- Python高级特性(3): Classes和Metaclasses(转)
原文:Python高级特性(3): Classes和Metaclasses 类和对象 类和函数一样都是Python中的对象.当一个类定义完成之后,Python将创建一个“类对象”并将其赋值给一个同名变 ...
- GNU Screen使用入门
前些天开始学习使用GNU Screen程序,发现这个工具在管理服务器时候确实挺方便的,于是写一篇文章总结一下,顺便介绍Screen的基本使用方法. 简介 GNU Screen是 一个基于文本的全屏窗口 ...
- 增强MyEclipse的代码自动提示功能
一般在Eclipse ,MyEclipse代码里面,打个foreach,switch等 这些,是无法得到代码提示的(不信自己试试),其他的就更不用说了,而在Microsoft Visual Stu ...
- WebHDFS vs HttpFS GateWay
基于hadoop 2.7.1版本 一.简介 1. WebHDFS官方简介: Introduction The HTTP REST API supports the complete FileSyste ...
- redis_cluster部署过程
Redis集群1.多个redis节点网络互联,数据共享2.所有的节点都是一主一从(可以是多个从),其中从不提供服务3.不支持同时处理多个键(如mset/mget),因为redis需要把键均匀分布在各个 ...
- php实现异步的程序调用
浏览器和服务器之间的通信是基于HTTP协议进行链接通讯的,它是一种请求和相应的协议.浏览器通过URL向服务器发送请求,服务器接收到请求并执行请求,然后服务器将执行完成的数据返回到客户端. 这就存在一个 ...
- Redis操作手册
一.Redis简介 1.1 NoSQL NoSQL,泛指非关系型数据库,NoSQL数据库分为四大类:键值存储数据库(Redis,Voldemort,Oracle BDB).列存储数据库(HBase,R ...
- SCADA 必备函数之 :关于消息的函数
Message Functions BroadcastSystemMessage//是将一条系统消息广播给系统中所有的顶级窗口. BroadcastSystemMessageEx//将消息发送到指定的 ...
- [转]linux shell 获取当前正在执行脚本的绝对路径
原文链接:http://sexywp.com/bash-how-to-get-the-basepath-of-current-running-script.htm 常见的一种误区,是使用 pwd 命令 ...