Sum of Different Primes UVA - 1213

题意:选择K个质数,使它们的和等于N。给出N和K(N<=1120,K<=14),问有多少种满足条件的方案,注意1不是素数,因此n = k = 1时答案为0

思路:1.素数筛法求出所有范围内的素数

2.0-1背包动态规划

有点不太明白三重循环的嵌套和顺序问题,还需要再看看

#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define INF 0x3f3f3f3f
#define mod 1000000007;
using namespace std;
//    freopen("in.txt","r",stdin);
//    freopen("out.txt","w",stdout);
const int maxn = 1200 + 2;
int vis[maxn],prime[maxn];
int num = 0,dp[maxn][15];
void get_prime()
{
    memset(vis,0,sizeof(vis));
    for(int i = 2; i < maxn; i++)
    {
        if(!vis[i])
        {
            prime[num++] = i;
            for(int j = i * 2; j < maxn; j += i) vis[j] = 1;
        }
    }
}
void init()
{
    dp[0][0] = 1;
    for(int k = 0; k < num; k++)
    {
        for(int i = maxn; i >= prime[k]; i--)
        {
            for(int j = 1; j < 15; j++)
            {
                dp[i][j] += dp[i - prime[k]][j - 1];
            }
        }
    }
}
int main()
{
    get_prime();
    init();
    int n,k;
    while(scanf("%d%d",&n,&k) && n + k)
    {
        printf("%d\n",dp[n][k]);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/sgsyacm/article/details/87089584