洛谷P1832 A+B Problem(再升级)
放题解
题目传送门
放代码
#include<bits/stdc++.h> using namespace std; int n,a[1005];//n为被分解数 a数组用于存储素数 long long dp[1005];//dp数组用于存储方案数(下标为n) int prime(int x)//埃氏筛法计算素数个数 { int flag[x+10]; memset(flag,1,sizeof(flag)); for(int i=2; i<=x; i++) if(flag[i]) for(int j=i*2; j<=x; j+=i) flag[j]=0; int sum=0; for(int i=2; i<=x; i++) if(flag[i]) a[++sum]=i; return sum; } int main() { dp[0]=1;//注意这里要填1不能填0,就像斐波那契数列第一个数也不能为0 cin>>n; for(int i=1; i<=prime(n); i++)//推到n结束 for(int j=a[i]; j<=n; j++) //完全背包的正循环 { dp[j]=dp[j]+dp[j-a[i]];//递推式 } cout<<dp[n]; return 0; }
事实并非理所当然❤️世界总是欲盖弥彰ღゝ◡╹)ノ♡