uva 1213 不同素数之和

本文深入探讨了如何通过质数的组合形成特定数值的方案总数,包括算法设计、实现细节以及效率优化策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:

选择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[n][m]<<endl;
	return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值