天平称重
问题描述:
用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量。
如果只有5个砝码,重量分别是1,3,9,27,81。则它们可以组合称出1到121之间任意整数重量(砝码允许放在左右两个盘中)。
本题目要求编程实现:对用户给定的重量,给出砝码组合方案。
例如:
用户输入:
5
程序输出:
9-3-1
用户输入:
19
程序输出:
27-9+1
要求程序输出的组合总是大数在前小数在后。
可以假设用户的输入的数字符合范围1~121。
思路:
直接暴力,情况也不多。每个砝码都有三种状态,放左盘/放右盘/不放。多重循环把每种情况都跑一遍。
输出的时候注意一下格式就行了。
代码:
#include<stdio.h>
#include<string.h>
int main()
{
int a[3]={0,-81,81};
int b[3]={0,-27,27};
int c[3]={0,-9,9};
int d[3]={0,-3,3};
int e[3]={0,-1,1};
int book[5];
int i,j,k,n,p,q,flag;
while(scanf("%d",&n)!=EOF)
{
memset(book,0,sizeof(book));
for(i=0;i<3;i++)
for(j=0;j<3;j++)
for(k=0;k<3;k++)
for(p=0;p<3;p++)
for(q=0;q<3;q++)
{
if(a[i]+b[j]+c[k]+d[p]+e[q]==n)
{
book[0]=a[i];
book[1]=b[j];
book[2]=c[k];
book[3]=d[p];
book[4]=e[q];
break;
}
}
flag=0;
for(i=0;i<5;i++)
{
if(flag==0&&book[i]>0)
{
flag=1;
printf("%d",book[i]);
}
else if(book[i]>0)
printf("+%d",book[i]);
else if(book[i]<0)
printf("%d",book[i]);
}
printf("\n");
}
return 0;
}