1,题目:
2,主要思想
运用递归实现深度搜索
3,解题思路
通过递归(此递归分为两部分,选或不选,是本题重点)求出不同的体积,将求出的体积作为下标在数组对应位置+1,然后对此位置所存的数进行判断,若为1则此下标为一个不同的体积vi++,最后输出vi即为所求。
4优化解法:
#include<bits/stdc++.h>
#include <algorithm>
using namespace std;
int n;
int a[51]={0},b[51]={0},c[1002]={0},ans=0;
void dfs(int i,int sum){
if(i>n){
if(c[sum]==0&&sum!=0){
c[sum]=1;
ans++;
}
return ;
}
else if(b[i]==0){
b[i]=1;
dfs(i+1,sum+a[i]);
dfs(i+1,sum);
b[i]=0;
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
dfs(1,0);
cout<<ans;
return 0;
}
5原先解法:
#include<iostream>
#include<string.h>
using namespace std;
int n,vi=0;
int a[21],b[1002]={0},flag1=1,flag2=0;
//flag1与flag2为判断选或不选的量
void dfs(int m,int flag,int sum1){
if(m>n){
b[sum1]++;
if(b[sum1]==1&&sum1!=0){
vi++;//找到一个不同的体积vi++
}
return;
}
if(flag==1){//选
sum1=sum1+a[m];
dfs(m+1,flag1,sum1);
dfs(m+1,flag2,sum1);
}
else if(flag==0){//不选
dfs(m+1,flag1,sum1);
dfs(m+1,flag2,sum1);
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
dfs(1,flag1,0);
dfs(1,flag2,0);
cout<<vi;
return 0;
}
6优化方法:
把选与不选合并了(本来多算了很多不必要的数值)。