题意:
给定一个正整数n,求将其分解成若干个素数之和的方案总数。
思路:
知道是dp,但是想了一会都没去想到完全背包,其实看到拆分就代表素数应该是能无限取的,那么在套用完全背包其实是非常简单的
但是写的时候有点问题,因为状态转移发程和普通的完全背包有点不同。
它的转移方程实际是:dp[i]=dp[i]+dp[i-比他小的素数]
①i是代表从元素i到0有多少种方案
②i较小时DP[0]=1会不断给DP[i]++,所以DP[0]表示有多少种方案可以由i减到0,所以要赋个初值。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e4+1000;
long long dp[maxn],v[maxn];
int main()
{
int n,i,j,t,cnt=0;
cin>>n;
for(i=2;i<=1010;i++)
{
int f1=0;
for(j=2;j<=i/2;j++)
{
if(i%j==0)
{
f1=1;break;
}
}
if(f1==0) v[cnt++]=i;
}
dp[0]=1;//当i较小时DP[0]=1会不断给DP[i]++
//表示有多少种方案可以由i减到0
for(i=0;i<cnt;i++)
{
for(j=v[i];j<=n;j++)
{
// dp[j]=max(dp[j],dp[j-v[i]]+1ll); (X)
// 状态转移方程:dp[i]=dp[i]+dp[i-比他小的素数]
dp[j]+=dp[j-v[i]];
}
}
cout<<dp[n]<<endl;
return 0;
}