1. 程式人生 > >砝碼組合問題用c語言實現

砝碼組合問題用c語言實現

5個砝碼

用天平稱重時,我們希望用盡可能少的砝碼組合稱出儘可能多的重量。
如果只有5個砝碼,重量分別是1,3,9,27,81。則它們可以組合稱出1到121之間任意整數重量(砝碼允許放在左右兩個盤中)。
本題目要求程式設計實現:對使用者給定的重量,給出砝碼組合方案。
例如:
使用者輸入:
5
程式輸出:
9-3-1
使用者輸入:
19
程式輸出:
27-9+1

要求程式輸出的組合總是大數在前小數在後。

可以假設使用者的輸入的數字符合範圍1~121。

解:

這個問題有很多網友用動態規劃來做,這裡我提供一種不同的思路,如果有錯誤之處,請大俠們莫噴。

這個問題有一個巧合,那就是每個砝碼都是3的多少次方,所以我下面的解題思路是利用3進位制來做;

我們可以用19來舉個例子:

首先19用三進製表現出來是0201,這時,我們不動其中的0和1,我們把2變為-1,然後進一位,得出的結果是 1-101,

然後我們就用三進位制把這個數求出來,即:1*3^3-1*3^2+1=27-9+1

所以正確答案是:27-9+1

當然這只是一個巧合,因為3^2就等於3^3-3^2即18=27-9;

這可以推廣到3的n次方上去,但是這個題若是換成4的多少次方來做就得用動態規劃了。

#include<stdio.h>
int p(int i)
{
int count=1;
for(int j=i;j>0;j--)
{
count*=3;
}
return count;
}
int main()
{
int n,i,j,a[6];
scanf("%d",&n);
for(i=0;i<6;i++)
{
a[i]=0;
}
for(i=0;i<6;i++)
{
a[i]=n%3+a[i];
if(a[i]==3)
{
a[i]=0;
a[i+1]=1;
}
else if(a[i]==2)
{
a[i]=-1;
a[i+1]=1;
}
n=n/3;
if(n==0)
break;
}
if(a[i+1]==1)
printf("%d",p(i+1));
for(j=i;j>-1;j--)
{
if(a[j]==-1)
printf("-%d",p(j));
else if(a[j]==1)
printf("+%d",p(j));
}
return 0;
}