zoukankan      html  css  js  c++  java
  • 有关背包问题

    要细细理解

    Problem Description
    妈妈
    你别哭
    泪光照亮不了
    我们的路
    让我们自己
    慢慢的走

    妈妈
    我会记住你和爸爸的模样
    记住我们的约定
    来生一起走



    上面这首诗节选自一位诗人纪念遇难同胞的作品,并没有华丽的语言,但是每位读者都应该能感受到作品传达的浓浓爱意,也许还有丝丝无奈。确实,太多的关于孩子不幸的报道冲击着我们每一颗柔弱的心。正如温家宝总理所说“多难兴邦”,这场灾难让我们很多80后的年轻人一下子成熟了起来,其中很多人以自愿者的身份走上了抗震救灾的第一线。
    今天,灾区又来了n位志愿者,抗震救灾指挥部需要将他们分为若干个小组,小组的数量不限,但是要求每个小组的人数必须为素数,请问我们有几种分组的方法呢?

    特别说明:
    1、可以只有一个组;
    2、分组的方法只和人数有关,而与具体的人员无关,即:你可以假设人是无区别的。
     
    Input
    输入数据首先包含一个正整数C,表示有C组测试用例,然后是C行数据,每行包含一个正整数n(2<=n<=150),表示志愿者的总人数。
     
    Output
    对于每组测试数据,请输出分组的方案数目,每个输出占一行。
     
    Sample Input
    3 3 4 5
     
    Sample Output
    1 1 2
     
    Author
    lcy
     
    Source
     


    本题是完全背包,因为素数可以重复出现;若不能重复出现,则是01背包。

     1 #include <iostream>
     2 #include <stdio.h>
     3 #include <math.h>
     4 using namespace std;
     5 
     6 int Pri[150];
     7 int dp[155];
     8 int cnt;
     9 
    10 
    11 void Prime()
    12 //枚举所有素数
    13 {
    14     int i,k,j;
    15     cnt=0;
    16     Pri[cnt++]=2;
    17     for(i=3;i<=150;i++)
    18     {
    19         k=(int)sqrt(double(i));
    20         for(j=2;j<=k;j++)
    21             if(i%j==0)break;
    22         if(j>k)Pri[cnt++]=i;
    23     }
    24 }
    25 
    26 void Solve1()
    27 //素数能重复出现的情况
    28 {
    29     int i,j;
    30     memset(dp,0,sizeof(dp));
    31 
    32     dp[0]=1;
    33 
    34     for(i=0;i<cnt;i++)
    35     {
    36         for(j=Pri[i];j<=150;j++)
    37         {
    38             dp[j]+=dp[j-Pri[i]];
    39         }
    40     }
    41 }
    42 
    43 void Solve2()
    44 //素数不能重复出现的情况
    45 {
    46     int i,j;
    47     memset(dp,0,sizeof(dp));
    48 
    49     dp[0]=1;
    50 
    51     for(i=0;i<cnt;i++)
    52     {
    53         for(j=150;j>=Pri[i];j--)
    54         {
    55             dp[j]+=dp[j-Pri[i]];
    56         }
    57     }
    58 }
    59 
    60 
    61 int main()
    62 {
    63     int n,cas;
    64     Prime();
    65     Solve1();
    66     cin>>cas;
    67     while(cas--)
    68     {
    69         scanf("%d",&n);
    70         printf("%d
    ",dp[n]);
    71     }
    72     return 0;
    73 }
  • 相关阅读:
    关于token=%1$s类似问题的说明
    Android alarmmanager的使用方法介绍
    Android setCompoundDrawablesWithIntrinsicBounds手工设置文本与图片相对位置说明
    Android Collections.sort的几种用法介绍
    android SlidingMenu属性说明
    Android 多用户模式原理和实现介绍
    Java语言中一些常用的API
    java集合框架+应用小技巧
    javaScript2
    CSS
  • 原文地址:https://www.cnblogs.com/wangmengmeng/p/4708197.html
Copyright © 2011-2022 走看看