一个商人有一个质量为40磅的砝码,一天他不小心将砝码摔成了4块。
商人发现每块砝码的质量都是整数磅,而且每块砝码的质量各不相同,
并且发现这4块砝码碎片可以在天平上称出1—40磅之间的任意质量(整数磅,即1磅,2磅,……)。
问这4块砝码碎片的质量各是多少?
#include<bits/stdc++.h>
using namespace std;
int a[4];
int b[4];
bool c[41];
void dfs(int id){
if(id>=4){
int w=0;
for(int i=0;i<4;i++){
if(b[i]==1){
w+=a[i];
}else if(b[i]==2){
w-=a[i];
}
}
if(w<0) w=-w;
c[w]=true;
}else{
b[id]=0;
dfs(id+1);
b[id]=1;
dfs(id+1);
b[id]=2;
dfs(id+1);
b[id]=0;
}
}
bool isGood(){
for(int i=1;i<=40;i++){
if(c[i]==false){
return false;
}
}
return true;
}
void test(int x1,int x2,int x3,int x4){
a[0]=x1;
a[1]=x2;
a[2]=x3;
a[3]=x4;
for(int i =1;i<=40;i++){
c[i]=false;
}
dfs(0);
if(isGood()){
for(int i=0;i<4;i++){
if(i!=0) cout<<" ";
cout<<a[i];
}
cout<<endl;
}
}
int main(){
ios::sync_with_stdio(0);
for(int i=1;i<40;i++){
for(int j=i+1;j<40;j++){
for(int k=j+1;k<40;k++){
int l = 40 - i - j - k;
if(l>k){
test(i,j,k,l);
}
}
}
}
return 0;
}