首页 > 其他 > 详细

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

时间:2016-02-28 12:33:27      阅读:169      评论:0      收藏:0      [点我收藏+]

题目链接

题意:选择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;
}

 

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

原文:http://www.cnblogs.com/zhaopAC/p/5224306.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!