zoukankan      html  css  js  c++  java
  • Uva1213(线性筛模板+dp)

    题意:

    把n拆成k个不同素数的和,有多少种拆法。

    解法:

    打表后dp即可,这个dp的问题可以归纳为:在n个数中选k个数,使得和m的方案数

     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<cstring>
     4 using namespace std;
     5 bool visit[10100000];
     6 int prime[10000000];
     7 int f[1130][200];
     8 
     9 int prime_num = 0;
    10 void generate_prim(int n) {
    11     memset(visit, true, sizeof(visit));
    12     for (int i = 2; i <= n; ++i) {
    13         if (visit[i] == true) prime[++prime_num] = i;    
    14         for (int j = 1; ((j <= prime_num) && (i * prime[j] <= n)); ++j) {
    15             visit[i * prime[j]] = false;
    16             if (i % prime[j] == 0) break;
    17         }
    18     }
    19     return;
    20 }
    21 
    22 void generate_plan() {
    23     generate_prim(1300);
    24     f[0][0] = 1;
    25     for (int k= 0; k < prime_num; k++) {
    26         for (int i = 1120; i >= 0; i--) {
    27             int UP = lower_bound(prime, prime + k, i) - prime + 1;
    28             for (int j = 1; j < UP; j++) {
    29                 if (prime[k] > i)break;
    30                 f[i][j] += f[i - prime[k]][j - 1];
    31             }
    32         }
    33     }
    34     return;
    35 }
    36 
    37 int main() {
    38     generate_plan();
    39     int n, m; 
    40     while (scanf("%d%d", &n, &m) && n&&m) {
    41         printf("%d
    ", f[n][m]);
    42     }
    43     return 0;
    44 }
  • 相关阅读:
    记录排序算法
    Redis 记录
    ELK Windows环境 强行记录
    前端组件 bootstrap-select 下拉 多选 搜索
    记一次微信点赞小网站的事故
    来自加班的吐槽
    .net 比较器
    做一个.net core 小项目 遇到的一些坑
    即使通讯架构
    resultMap 映射
  • 原文地址:https://www.cnblogs.com/romaLzhih/p/9546833.html
Copyright © 2011-2022 走看看