codeupの魔法のポケット(C ++)

タイトル説明

魔法のポケットがあり、総容量は、この記事のポケットのいくつかのバリエーションで、40だった、これらの項目の合計量は40でなければなりません。ジョンは今得られるn個の項目、それぞれの項目のボリュームA1、A2 ......あります。物体40の総体積が選択されている場合、ジョンは、次いで、これらのアイテムを得ることができる魔法のポケット、ジョンを使用して、これらの項目の一部から選択することができます。質問は今、項目を選択するジョンどのように多くの異なる方法です。

エントリー

第一の入力線は正の整数N(1 <= N <= 20)であり、異なるアイテムの数を示します。次のn行は、各行がそれぞれ、1と40との間の正の整数であり、所与の値は、A2をA1 ...... A。

輸出

出力選択モードの異なるアイテムの数。

サンプル入力  のコピー

2
12
28
3
21
10
5

サンプル出力のコピー

1
0

ソリューションの概要:それは事に各m =メートル、0-1ナップザック問題、にバックパックで何かのn容量のメートルである - [n]は、N = N - 1。再帰境界:バックパックの容量を正確に0、1戻り、バックパックの容量を配置する(すなわち、何かに入れることができない)、またはすべての項目の後にバックパックがまだ0(すなわち、場合N == 0)に等しくない場合に容量が0よりも小さいです、0はこの時点で返されます。

#include <stdio.h>
#include <iostream>
using namespace std;
int a[20]={0};
int F(int m,int n)     // 容量为 m 的背包里放进前 n 个物品
{
    if(m==0)          // 背包正好装满,此时容量为0,是合适的方案,返回 1 
        return 1;
    if(n==0 || m<0)  // 当背包里只能放进去0个物品或者背包的容量小于0,此时返回 0
        return 0;
    return F(m,n-1)+F(m-a[n],n-1);
 
}
 
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        printf("%d\n",F(40,n));
    }
    return 0;
}

 参考ブログ:https://blog.csdn.net/Zizizi9898/article/details/89212550

https://blog.csdn.net/LoveHYZH/article/details/88026078

 

公開された32元の記事 ウォンの賞賛2 ビュー1614

おすすめ

転載: blog.csdn.net/qq_38969094/article/details/104349992