一位商人有一个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;
}