タイトル説明
魔法のポケットがあり、総容量は、この記事のポケットのいくつかのバリエーションで、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