DP Sum of Different Primes POJ 3132

輸入n和k,使k個不相同的素數的和爲n,求共有多少組

提示

1)dp[i][j]中i表示當前的和,j表示含有素數的個數

#include <stdio.h>
#include <string.h>
int prime(int n)                 //判素數
{
	if(n==0||n==1)
		return 0;
	if(n==2||n==3)
		return 1;
	int i;
	for(i=2;i*i<=n;i++)
		if(n%i==0)
			return 0;
	return 1;
}
int f[1005];
int p[1005];
int mark[1005];
long long dp[1500][16];
int main()
{
	memset(mark,0,sizeof(mark));
	int i,j,l;
	int tot=0;
	for(i=0;i<1500;i++)           //將素數存於p[1500]中
	{
		if(mark[i]==0)
		{
			if(prime(i))
			{
				p[tot++]=i;
				for(j=2;j*i<1500;j++)
					mark[i*j]=1;
			}
		}
	}
	memset(dp,0,sizeof(dp));
	dp[0][0]=1;
	for(i=0;i<tot;i++)          //加入的素數
	{
		for(j=1120;j>=p[i];j--)          //加上素數之後的和
		{
			for(l=15;l>0;l--)          //加上素數之後的素數個數
			{
				dp[j][l]+=dp[j-p[i]][l-1];
			}
		}
	}
	int n,k;
	while(scanf("%d%d",&n,&k)!=-1)
	{
		if(n==0&&k==0)
			break;
		printf("%I64d\n",dp[n][k]);
	}
	return 0;
}


發佈了58 篇原創文章 · 獲贊 8 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章