题意:
给定一个正整数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; }