【问题描述】
用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量。
如果只有5个砝码,重量分别是1,3,9,27,81
则它们可以组合称出1到121之间任意整数重量(砝码允许放在左右两个盘中)。
本题目要求编程实现:对用户给定的重量,给出砝码组合方案。
例如:
用户输入:
5
程序输出:
9-3-1
用户输入:
19
程序输出:
27-9+1
要求程序输出的组合总是大数在前小数在后。
可以假设用户的输入的数字符合范围1~121。
暴力 遍历
#include<iostream>
#include<cstring>
# include <cstdlib>
using namespace std;
string str="";
int n;
int wei[5]={1,3,9,27,81};
int flag[3]={-1,0,1};
int sum=0;
string str1(int n)
{
string str="";
if(n>10)
{
str+=char(n/10+'0');
str+=char(n%10+'0');
}else{
str+=char(n+'0');
}
return str;
}
string pd(int n)
{
if(n==-1)
{
return "-";
}else{
return "+";
}
}
int f(int k)
{
if(k==-1)
{
if(sum==n)
{
cout<<str;
}
return 0;
}
for(int i=0;i<=2;i++)
{
sum=sum+wei[k]*flag[i];
string str2;
if(flag[i]!=0)
{
str2=str;
if(str=="")
{
str+=str1(wei[k]);
}
else{
str+=pd(flag[i]);
str+=str1(wei[k]);
}
}
f(k-1);
sum=sum-wei[k]*flag[i];
if(flag[i]!=0)
{
str=str2;
}
}
}
int main()
{
cin>>n;
f(4);
return 0;
}