Think:
1题意:输入n(n <= 1120), k(k <= 14),询问由k个不同素数相加得到n的方案数,{2, 4},{4, 2}属于一种方案,输入0, 0表示结束,不作处理
2思路:素数表+dp
3反思:
1>dp状态转移方程不理解,需要进行专题练习或知识复习
2>注意状态转移方程中重复元素情况的处理
以下为Accepted代码
#include <bits/stdc++.h>
using namespace std;
int v[1400], dp[1400][24];
void Init();
int main(){
Init();
int n, k;
while(scanf("%d %d", &n, &k) && (n || k)){
printf("%d\n", dp[n][k]);
}
return 0;
}
void Init(){
memset(v, 0, sizeof(v));
memset(dp, 0, sizeof(dp));
int i, j, k;
v[1] = 1, v[2] = 0;
for(i = 2; i <= 1400; i++){
if(!v[i]){
for(j = i*2; j <= 1400; j += i){
v[j] = 1;
}
}
}
dp[0][0] = 1;
for(i = 2; i <= 1120; i++){
if(!v[i]){
for(j = 14; j >= 1; j--){
for(k = 1120; k >= i; k--){
dp[k][j] += dp[k-i][j-1];
}
}
}
}
}

本文介绍了一种使用动态规划解决特定数学问题的方法——通过k个不同素数相加得到n的方案数。该问题利用预先计算的素数表与动态规划相结合来高效解答。文章提供了完整的AC代码实现。
1588

被折叠的 条评论
为什么被折叠?



