砝码组合(三进制与深度搜索)

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/H0_0P/article/details/53644502

砝码算法题梳理
 题目内容:
用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量。
如果只有5个砝码,重量分别是1,3,9,27,81。
则它们可以组合称出1到121之间任意整数重量(砝码允许放在左右两个盘中)。
本题目要求编程实现:对用户输入的重量(1~121),
给出砝码组合方案(用加减式表示,减代表砝码放在物品盘)。
例如:
输入:
5
输出:
9-3-1

输入:
19
输出:
27-9+1
要求程序输出的组合总是大数在前小数在后。
输入描述
用户输入的重量(1~121),
输出描述
给出砝码组合方案(用加减式表示,减代表砝码放在物品盘)。
输入样例
19
输出样例
27-9+1

在这里我有2种思路:
一种是暴力搜索,这里由于数据不大,所以没问题

#include <stdio.h>
#include <iostream>
using namespace std;
int weight;
int a[5] = {81, 27, 9, 3, 1};
int b[5];
int sum(){
 int s = 0;
 for(int i = 0; i < 5; i++){
  s = s + b[i] * a[i];
 }
 return s;
}
int DFS(int i){
 if(i == 5){
  if(sum() == weight){
   int k;
   for(k = 0; k < 5; k++){
    if(b[k] == 1){
     cout << a[k];
     break;
    }
   }
   for(int i = k + 1; i < 5; i++){
    if(b[i] == 1){
     cout << "+" << a[i];
    }
    if(b[i] == -1){
     cout << "-" << a[i];
    }
   }
  return 1;
  }
  
 }
 
 else{
  for(int j = -1; j <= 1; j++){
   b[i] = j;
   DFS(i + 1);
  } 
 }
  
}
int main(){
 cin >> weight;
 DFS(0);
 
 return 0;
} 


另外一种是三进制:先看一看这个原理点击打开链接(详细解释了二进制与三进制的区别)

#include <stdio.h>
#include <iostream>
using namespace std;

int main(){
	int a[5] = {1, 3, 9, 27, 81};
	int weight;
	int w[5] = {0};
	cin >> weight;
	//先将输入的数字转化为3进制
	int i = 0;
	while(weight > 0){
		w[i] = weight % 3;
		weight = weight / 3;
		i++;
	}
	//for(int j = i - 1; j >= 0; j--)
	//	cout << w[j];
	
	//将砝码数减少,化为另外一种形式,更大的砝码减小的 
	for(int j = 0; j < i; j++){
		if(w[j] == 2){ //如果是2,该位变为-1且向前进一位 
			w[j] = -1;
			w[j + 1]++;
		}
		if(w[j] == 3){
			w[j] = 0;
			w[j + 1]++;
		} 
	} 
	//for(int j = 4; j >= 0; j--)
	//	cout << w[j];
	
	//输出
	bool first = true;
	for(int i = 4; i >= 0; i--){
		if(w[i] == 1 && first != true){
			cout << "+" << a[i];
		}
		if(w[i] == 1 && first == true){
			cout << a[i];
			first = false;
		}
		if(w[i] == -1){
			cout << "-" << a[i];
		}
	}
	 
	return 0;
}


展开阅读全文

没有更多推荐了,返回首页