神奇的分組

題目描述

衆所周知小P是一個十分有愛心的同學,所以他熱衷於各種志願活動,一天小P參加一個志願活動,由於小P是某名校大學生,所以分組的事情大家想讓小P來做,可是他的高數只考了4分,顯然不能完成這項任務,所以他就偷偷的讓我來找你幫他解決問題,我想聰明非凡你一定可以解決!
已知有n位志願者,需要將他們分爲若干個小組,小組的數量不限,但是要求每個小組的人數必須爲素數,請問我們有幾種分組的方法呢?

特別說明:
 
1、可以只有一個組;
2、分組的方法只和人數有關,而與具體的人員無關,即:你可以假設人是無區別的。
 

輸入

 輸入數據首先包含一個正整數C,表示有C組測試用例,然後是C行數據,每行包含一個正整數n(2<=n<=150),表示志願者的總人數。
 
 

輸出

對於每組測試數據,請輸出分組的方案數目,每個輸出佔一行。

示例輸入

3 
3 
4 
5

示例輸出

1 
1 
2

提示


//先求出150以內的所有素數,存在數組a[]中,p記錄下標,相當於有p件物品
#include <stdio.h>
#include <string.h>
#include <math.h>
int max(int a,int b)
{
    return a>b?a:b;
}
int dp[155];
int a[151];
int main()
{
    int c,n,i,j,k;
    scanf("%d",&c);
    for(k=1; k<=c; k++)
    {
        memset(dp,0,sizeof(dp));
        memset(a,0,sizeof(a));
        int p=0;
        dp[0]=1;
        scanf("%d",&n);
        for(i=2; i<150; i++)
        {
            for(j=2; j<=sqrt(i); j++)
            {
                if(i%j==0)
                    break;
            }
            if(j>sqrt(i))
                a[p++]=i;
        }
        for(i=0; i<p; i++)
            for(j=a[i]; j<=n; j++)
                dp[j]=dp[j]+dp[j-a[i]];  //dp[i][j]表示前i個素數,剩餘j個人的空間情況下的種類數
        printf("%d\n",dp[n]);
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章