天枰稱重 列舉法 進製轉換 逢十進一模版

2021-10-08 22:59:42 字數 2125 閱讀 5214

題意:

方法1(列舉法)

思路:

private

static string fn

(int inputnum)

;for

(int a : arr)

for(

int b : arr)

for(

int c : arr)

for(

int d : arr)

for(

int e : arr)

for(

int f : arr)

for(

int g : arr)

for(

int h : arr)

for(

int i : arr)

for(

int j : arr)

for(

int k : arr)

for(

int l : arr)

for(

int m : arr)

for(

int n : arr)

}// 刪去第乙個"+"

builder.

deletecharat(0

);return builder.

tostring()

;}public

static

void

main

(string[

] args)

方法2(變種三進製)

引導問題:把砝碼重量改為2的指數冪(1,2,4,8,16…)

使用二進位制來解決該問題:

把inputnum轉為二進位制,例如稱量重量為11的物體,11的二進位制為1011

二進位制的每一位數可以表示兩種狀態:1—> 取對應位的2次冪,0—> 不取對應位的2次冪

把1011(二進位制)轉為十進位制:8*1 + 4*0 + 2*1 + 1*1,即11 = 8 + 2 + 1,而8,2,1恰好就是砝碼的重量

模擬上面的方法,使用三進製來解決該問題

把inputnum轉為三進製,例如稱量重量為11的物體,11的三進製為102

如果模擬上面二進位制的方法:11 = 9*1 + 3*0 + 2*1,取一次9,取2次1,不符合題意,因為要求每種重量的砝碼只能取一次

改變一下規則:讓三進製數逢2進1,原位數自減1,例如102(三進製)—> 1 1 -1—> 11 = 9*1 + 3*1 + 1*(-1)—> 取一次9取一次3放在右盤,取一次1放在左盤

使用該方法前建議做一下這道題:leetcode 415. 字串相加

下面的**是模擬逢10進1,改為的逢2進1,並且都是對字元內容運算的處理

// 讓三進製數逢2進1,原位數自減1,例如102(三進製)---> 1  1  -1---> 11 = 9*1 + 3*1 + 1*(-1)

// 220121 ---> -1 3 0 1 2 1 ---> -1 0 1 1 2 1 ---> -1 0 1 1 -1 2 ---> -1 0 1 1 -1 -1 1

// -1 0 1 1 -1 -1 1

// 0 1 2 3 4 5 6

// 1 3 9 27 ...

public

static string fn2

(int inputnum)

// 上面迴圈結束後就得到了乙個三進製轉十進位制每一位數對應的係數的列表

stringbuilder builder =

newstringbuilder()

;// 倒序遍歷列表,將相應係數乘上對應位數新增到stringbuilder中

for(

int j = list.

size()

-1; j >=

0; j--

)return builder.

deletecharat(0

).tostring()

;}

收穫

nefuoj 1120 天平稱重

字串現在有好多種砝碼,他們的重量是 w 0,w 1,w 2,每種各乙個。問用這些砝碼能不能表示乙個重量為m的東西。多組測試資料。第一行有兩個整數w,m 3 w 10 9,1 m 10 9 如果能,輸出yes,否則輸出no。3 7 3 12 no yes題解 這道題就是簡單的貪心演算法的題,只要有勇氣...

洛谷 P1441 砝碼稱重 子集列舉 bitset

題目描述 現有n個砝碼,重量分別為a1,a2,a3,an,在去掉m個砝碼後,問最多能稱量出多少不同的重量 不包括0 請注意,砝碼只能放在其中一邊。輸入格式 輸入檔案weight.in的第1行為有兩個整數n和m,用空格分隔 第2行有n個正整數a1,a2,a3,an,表示每個砝碼的重量。輸出格式 輸出檔...