自己用dfs来做的
时间限制: 1.000 Sec 内存限制: 64 MB
题目描述
桐桐有2g、3g、5g、7g、10g、15g的砝码各有一枚。她想知道用这些砝码能称出多少种不同的质量。
输出
只有一个数,表示能称出的不同质量的个数。
#include<bits/stdc++.h>
#define sc scanf
#define pr printf
using namespace std;
using ll = long long ;
const int N = 1e3+10;
map<int,int>m; //存储不同砝码组成的重量
int a[7]={0,2,3,5,7,10,15};
int q[7]; //存储选的砝码
int arr[N]; //标记选不选这个砝码
bool ar[N]; //因为砝码只能选一次,用来标记是否已选
void dfs(int x){
if(x>6){
int num=0;
for(int i=1;i<=6;++i){
// 被arr[]数组标记为 1 就表示这组砝码中那些被选了
if(arr[i]==1)num+=q[i];
}
m[num]++;
return ;
}
for(int i=1;i<=6;++i){
if(!ar[i]){
//选这个砝码
ar[i]=1;//标记
arr[i]=1;
q[x]=a[i];
dfs(x+1);
//不选这个砝码
arr[i]=2;
q[x]=a[i];
dfs(x+1);
ar[i]=0;//恢复现场
}
}
}
int main(){
dfs(1);
// -1 是因为如果每个砝码都不选就有个结果为0
cout<<m.size()-1;
return 0;
}