砝码碎片问题

一位商人有一个40磅的砝码,由于跌落在地而碎成4块,后来称得每块碎片的重量都是整数,而且可以用这4块来称从1到40磅之间的任意整数磅的重物,问这4块砝码碎片各重多少?输出格式为每行输出一组砝码值,值序为升序,用'\t'间隔。


#include <iostream>
using namespace std;

int test(int*, int);//test测试函数用来测试现有碎片能否称出所需重量
int main()
{
	int w[4], m;//数组w[4]用来存放四个碎片的重量,m用来表示货物重量1~40
	for (w[0] = 1; w[0] < 10; w[0]++)
	{
		for (w[1] = w[0]+1; w[1] < 40-w[0]; w[1]++)
		{
			for (w[2] = w[1] + 1; w[2] < 40-w[0]-w[1]; w[2]++)
			{
				w[3]=40-w[0]-w[1]-w[2];
				if (w[2] > w[3])break;//确保升值排序
				for (m = 1; m < 40; m++)
				{
					int flag=test(w, m);
					if (flag == 0)break;
				}
				if (m == 40) 
				{
					cout << w[0] << '\t' << w[1] << '\t' << w[2] << '\t' << w[3] << endl; 
					return 0;
				}
			}
		}
	}
}
int test(int*a, int m)
{
	int b[4]={-1,-1,-1,-1},i,sum=0;
	for (b[0] = -1; b[0] <= 1; b[0]++)
	{
		for (b[1] = -1; b[1] <= 1; b[1]++)
		{
			for (b[2] = -1; b[2] <= 1; b[2]++)
			{
				for (b[3] = -1; b[3] <= 1; b[3]++)
				{
					sum = 0;
					for (i = 0; i < 4; i++)
					{
						
						sum += a[i] * b[i];
						
					}
					if (sum == m)return 1;
				}
			}
		}
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值