您的位置:首页 > 其它

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;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: