题目描述
2019可以被分解成若干个(不是两个)两两不同的素数,请问不同的分解方案有多少种?
注意:分解方案不考虑顺序,如2+2017=2019和2017+2=2019属于同一种方案。
输入
无
输出
分解方案的种数。
输入样例 1
无
输出样例 1
无
解题思路
先找出2019的所有素数,然后再依次选择判断是否相等。(使用01背包)
代码
import java.math.BigInteger;
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
int m=2019;
int [][]f=new int[2025][2025];
ArrayList<Integer> p=new ArrayList<>();
int o=1;
for(int i=2;i<m;i++){ //计算2019内的所有素数 并加入到列表
for (int j=2;j<i;j++){
if (i%j==0){
o=2;
break;
}
}
if (o==1){
p.add(i);
}
o=1;
}
f[0][0]=1;
for (int i=1;i<=306;i++){ //用01背包计算数目
for (int j=0;j<=m;j++){
if (j<p.get(i-1)){
f[i][j]=f[i-1][j];
}else {
f[i][j]=f[i-1][j-p.get(i-1)]+f[i-1][j];
}
}
}
BigInteger bigInteger=new BigInteger(String.valueOf(f[306][2019])); //输出最后的结果
System.out.println(bigInteger);
}
}