1 条题解
-
0
C :
#include <stdio.h> long int a[30]; long int b[30]; long int T; int n; long int sum=0; void f(int long t,int pos,int i ) {int j; if(t==T&&pos!=0&&i<1)//终止条件 注意全部遍历完再进行判断(防止 -1 1 -2 2 3 -3的特例) 并且 不能不选 {sum++; for(j=pos-1;j>=0;j--)//倒着遍历倒着输出 printf("%ld ",b[j]); printf("\n"); } else { if(i<1)return ;//遍历到数组第一项还未满足t==T;则返回 f(t,pos,i-1); t+=a[i];b[pos]=a[i]; f(t,pos+1,i-1); t-=a[i]; } } int main() { int i; scanf("%d",&n); for(i=1;i<=n;i++) scanf("%ld",&a[i]); scanf("%ld",&T); f(0,0,n); printf("%d\n",sum); return 0; }
C++ :
#include<iostream> #include<string.h> #include<stdlib.h> using namespace std; int a[40]; int book[40]; int n,T,sum,count; void DFS(int k); int main() { int i,j; cin>>n; for(i=0;i<n;i++) cin>>a[i]; cin>>T; sum=0; count=0; memset(book,0,sizeof(book)); DFS(n-1); //按题目要求的输出顺序,从后往前搜索 printf("%d\n",count); return 0; } void DFS(int k) { int i,j,flag=0; if(k<0) { sum=0; for(i=0;i<n;i++) { if(book[i]==1) { flag=1; sum+=a[i]; } } if(sum==T && flag) //flag是为了判断这n个数是不是全没被选中,全没被选中是不允许的。 { count++; for(i=0;i<n;i++) { if(book[i]==1) printf("%d ",a[i]); } printf("\n"); } return ; } book[k]=0; DFS(k-1); book[k]=1; DFS(k-1); }
- 1
信息
- ID
- 1446
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者