神奇的口袋(百練2755)


描述 有一個神奇的口袋,總的容積是40,用這個口袋可以變出一些物品,這些物品的總體積必須是40。John現在有n個想要得到的物品,每個物品的體積分別是a1,a2……an。John可以從這些物品中選擇一些,如果選出的物體的總體積是40,那麼利用這個神奇的口袋,John就可以得到這些物品。現在的問題是,John有多少種不同的選擇物品的方式。 輸入 輸入的第一行是正整數n (1 <= n <= 20),表示不同的物品的數目。接下來的n行,每行有一個1到40之間的正整數,分別給出a1,a2……an的值。 輸出 輸出不同的選擇物品的方式的數目。 樣例輸入
3
20
20
20
樣例輸出
3

枚舉,最大2^20.


遞歸求解

1
#include<stdio.h>
2
#include<string.h>
3
#include<algorithm>
4
#include<iostream>
5
using namespace std;
6
int a[50];
7
int way(int w, int k)
8
{
9
    if(w==0) return 1;
10
    if(k==0) return 0;
11
    else
12
    return way(w, k-1)+way(w-a[k], k-1);        //無限的循環,什麼時候纔是結尾(蛇吞尾)
13
}
14
int main()
15
{
16
    memset(a, 0, sizeof(a));
17
    int n;
18
    cin>>n;
19
    for(int i=1; i<=n; i++)
20
        cin>>a[i];
21
    cout<<way(40, n)<<endl;
22
    return 0;
23
}

1
//動規方法求解

#include<iostream>
2
using namespace std;
3
int a[50];
4
int way[50][50];        //way[w][k]表示 k個元素組成w的方法數 
5
int main()
6
{
7
    int n;
8
    cin>>n;
9
    for(int i=1; i<=n; i++)
10
    {
11
        cin>>a[i];
12
        way[0][i]=1;        
13
    } 
14
    way[0][0]=1;
15
    for(int w=1; w<=40; w++)
16
        for(int k=1; k<=n; k++)
17
        {
18
            way[w][k]=way[w][k-1];  //?
19
            if(w-a[k]>=0)
20
            {
21
                way[w][k]+=way[w-a[k]][k-1];    //miracle
22
             } 
23
        }
24
        cout<<way[40][n];
25
26
    return 0;
27
}





發佈了74 篇原創文章 · 獲贊 3 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章