5个砝码
用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量。
如果只有5个砝码,重量分别是1,3,9,27,81。则它们可以组合称出1到121之间任意整数重量(砝码允许放在左右两个盘中)。
本题目要求编程实现:对用户给定的重量,给出砝码组合方案。
例如:
用户输入:
5
程序输出:android移动应用程序开发教程
9-3-1
用户输入:
19
程序输出:
27-9+1
要求程序输出的组合总是大数在前小数在后。
可以假设用户的输入的数字符合范围1~121。
解题思路:其实就是用暴力的方法去遍历就好了,把每一情况都遍历一下,如果出现了可行的结果就返回。。。
#include <iostream>
#include <cstdio>
#include <memory.h>
using namespace std;
int a[14]= {0,81,0,27,-27,0,9,-9,0,3,-3,0,1,-1};
int mark[5],n;
int main()
{
while(~scanf("%d",&n))
{
int temp=0,count=0;
for(int i=0; i<2; i++){
count=count+a[i];
if(temp) break;
if(count==n){
mark[temp++]=a[i];
break;
}
for(int j=2; j<5; j++ ){
if(temp) break;
count=count+a[j];
if(count==n){
mark[temp++]=a[i],mark[temp++]=a[j];
break;
}
for(int k=5; k<8; k++ ){
if(temp) break;
count=count+a[k];
if(count==n){
mark[temp++]=a[i],mark[temp++]=a[j],mark[temp++]=a[k];
break;
}
for(int l=8; l<11; l++ ){
if(temp) break;
count=count+a[l];
if(count==n){
mark[temp++]=a[i],mark[temp++]=a[j],mark[temp++]=a[k],mark[temp++]=a[l];
break;
}
for(int m=11; m<14; m++ ){
if(count+a[m]==n)
{
mark[temp++]=a[i],mark[temp++]=a[j],mark[temp++]=a[k],mark[temp++]=a[l],mark[temp++]=a[m];
break;
}
}
count=count-a[l];
}
count=count-a[k];
}
count=count-a[j];
}
count=count-a[i];
}
int i=0;
while(mark[i]==0) i++;
printf("%d",mark[i++]);
for(; i<temp; i++)
if(mark[i]!=0)
{
printf("%+d",mark[i]);
}
}
return 0;
}上面的代码明显太Low了,所以还是用递归的好点,以后出现多重递归的时候还是尝试着使用递归的方式,因为所有的多重循环都能用递归来实现,这样的话代码就漂亮多了,以后果断不在写超过三重的循环了,太掉价