1599 - 神奇的口袋
有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40。John现在有n个想要得到的物品,每个物品的体积分别是a1,a2……an。John可以从这些物品中选择一些,如果选出的物体的总体积是40,那么利用这个神奇的口袋,John就可以得到这些物品。现在的问题是,John有多少种不同的选择物品的方式。
<br />
Input
输入的第一行是正整数n (1 <= n <= 20),表示不同的物品的数目。接下来的n行,每行有一个1到40之间的正整数,分别给出a1,a2……an的值。
<br />
Output
输出不同的选择物品的方式的数目。
<br />
Examples
Input
2 12 28 3 21 10 5
Output
1 0
Solution C
#include <stdio.h> #include <string.h> int time; int stuff[20]; void check(int sum, int i, int n) { if(i == n+1) // fail return; else if(sum == 40){ time++; return; }else if(sum < 40){ check(sum, i+1, n); check(sum+stuff[i], i+1, n); }else if(sum > 40) return; return ; } int main() { int n; while(scanf("%d", &n) != EOF){ memset(stuff, 0, sizeof(stuff)); time=0; for(int i = 0; i < n; i++) scanf("%d", stuff + i); check(0, 0, n); printf("%d\n", time); } return 0; }
Solution C++
#include<iostream> #include<stdio.h> #include<algorithm> using namespace std; int a[20]; int n; void compute(int a[],int &sum,int k,int left){//递归函数 //cout<<"left="<<left<<endl; if(left==0){ sum++; return; } else{ if(k>=n||a[k]>left)return; else{ for(int i=k;i<n;i++) compute(a,sum,i+1,left-a[i]); } } } int main(void){ int sum; while(scanf("%d",&n)!=EOF){ sum=0; for(int i=0;i<n;i++) scanf("%d",&a[i]); sort(a,a+n); compute(a,sum,0,40); printf("%d\n",sum); } return 0; }