UVA1213Sum of Different Primes(素数打表 + DP)

题目链接

题意:选择k个素数,使得和为N(1120)的方案数;

筛选出 <= N 的素数,然后就背包

写的时候没初始dp[0][0] = 1;而且方案数也没相加,真是弱逼

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int Max = 1120;
int prime[Max + 5], total,flag[Max + 5];
int dp[Max + 5][20];
void get_prime()
{
    total = 0;
    memset(flag, 0, sizeof(flag));
    for(int i = 2; i <= Max; i++)
    {
        if(flag[i] == 0)
        {
            prime[ ++total ] = i;
            for(int j = i; j <= Max / i; j++)
                flag[j * i] = 1;
        }
    }
}
int main()
{
    get_prime();
    int n,k;
    while(scanf("%d%d", &n, &k) != EOF)
    {
        if(n == 0 && k == 0)
            break;
        memset(dp, 0, sizeof(dp));
        dp[0][0] = 1;  //初始
        for(int i = 1; i <= total; i++)  //对于每一个素数进行判断
        {
            for(int j = n; j >= prime[i]; j--)  //对于每一个能选择素数的判断
            {
                for(int m = 1; m <= k; m++)  //选择的个数可以使1 ... k
                {
                    if(dp[j - prime[i]][m - 1] != 0)
                        dp[j][m] += dp[j - prime[i]][m - 1];  //当前状态选择m个素数和为j  == 选择m - 1个素数合为 j - prime[i]
                }
            }
        }
        printf("%d\n", dp[n][k]);
    }
    return 0;
}
时间: 2024-10-16 09:05:52

UVA1213Sum of Different Primes(素数打表 + DP)的相关文章

hdu 2161 Primes 素数打表

在kuangbin带你飞专题看到的,水了一发,但是wa了一次,T了一次,竟然连素数打表都快不会写了. 而且连求素数时候只需到根号n就可以都忘了,假设有因子m大于√n,那么n/m一定小于√n,所以它在√n前面已经被选出来了. 代码: #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<vector>

UVA1213 Sum of Different Primes(素数打表+dp)

UVA - 1213 Sum of Different Primes Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description A positive integer may be expressed as a sum of different prime numbers (primes), in one way or another. Given two

hdu 3092 (简化的素数打表+dp+log的用法) ps(开数组和预处理时数组要大点处理多一点。。。)

题意:给你一个3000以内的数s,让你把它分解成几个数的和,要求得到的这几个数最小公倍数最大 对于两个数a,b,如果不互质那么对于答案的贡献最多是a*b,假设他们最大公约数为k,那么把a,b分为a,b/k,b-b/k三个数的积肯定会大于等于a*b: 因为当b/k > 1 && b-b/k > 1时, (b/k-1)(b-b/k-1) >= 1. 即b*(b-b/k) >= b.而当b/k==1时那就是a*b==a*(b-b/k)*k; 所以相对肯定是两两互质对答案贡

HDOJ(HDU) 2161 Primes(素数打表)

Problem Description Write a program to read in a list of integers and determine whether or not each number is prime. A number, n, is prime if its only divisors are 1 and n. For this problem, the numbers 1 and 2 are not considered primes. Input Each i

[ACM] POJ 2635 The Embarrassed Cryptographer (同余定理,素数打表)

The Embarrassed Cryptographer Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 11978   Accepted: 3194 Description The young and very promising cryptographer Odd Even has implemented the security module of a large system with thousands of

Fermat’s Chirstmas Theorem (素数打表的)

Fermat’s Chirstmas Theorem Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Submit Status Practice SDUTOJ 2093 Description In a letter dated December 25, 1640; the great mathematician Pierre de Fermat wrote to Marin Mersenne

hdu4777 Rabbit Kingdom 树状数组+区间操作+素数打表

题目大意:给N个数,有M个查询,问区间[L,R]之间有多少个数与这个区间内的其他数都互质. 思路:dp显然很难搞,既然是求区间就试试每一个数最大可以对答案产生贡献的区间,即预处理出一个数在(lp,rp)内始终与其他数互质的最大区间 则lp和rp分别为左边和右边第一个与他不互质的数的位置 处理的时候素数打表然后从左到右始终更新对于某一个素因子出现的最右的位置然后更新l,r,可以做到 然后就是把查询按l从小到大排序,这样的话每处理一个新的查询,对于在这个查询的 l 左边的数就可以不用考虑了 然后我们

hdu1016 Prime Ring Problem dfs 素数打表

意思是给你一个数n,要构成一个素数环,这个素数由1-n组成,它的特征是选中环上的任意一个数字i,i与它相连的两个数加起来都分别为素数,满足就输出. 这个题的做法和hdu1015做法差不多都是使用dfs 回溯.不同之处在于这个要全部搜索,而hdu1015只需要搜索第一组就可以. 其次在这个题目中使用素数打表的方式简化素数判定,在一定情况下也是对效率有所提高的. Prime Ring Problem Time Limit: 4000/2000 MS (Java/Others) Memory Limi

Goldbach`s Conjecture LightOJ - 1259 (素数打表 哥德巴赫猜想)

题意: 就是哥德巴赫猜想...任意一个偶数 都可以分解成两个(就是一对啦)质数的加和 输入一个偶数求有几对.. 解析: 首先! 素数打表..因为 质数 + 质数 = 偶数 所以 偶数 - 质数 = 质数 ... 我真是蠢啊 还有  vis要用bool类型的!!!!  int会直接爆 代码如下: #include <iostream> #include <cstdio> #include <sstream> #include <cstring> #includ