來看乙個問題;該問題的解法是 暴力列舉;這大概是acm方面的;名稱叫火柴棒等式;
給你n根火柴棍,你可以拼出多少個形如「a+b=c」的等式?等式中的a、b、c是用火柴棍拼出的整數(若該數非零,則最高位不能是0)。用火柴棍拼數字0-9的拼法如圖所示:
注意:1. 加號與等號各自需要兩根火柴棍
2. 如果a≠b,則a+b=c與b+a=c視為不同的等式(a、b、c≥0)
3. n根火柴棍必須全部用上
輸入 輸入乙個整數n(n≤24)。
輸出 輸出能拼成的不同等式的數目。
問題簡述:給你n(n<=24)根火柴棒,叫你拼出 「a + b = c」這樣的等式,求方案數。
思路:由於題目中已經給出,最多有24根火柴,而等號和加號各用4根的前提下,a\b\c三個數則總共只有20根火柴,資料範圍較小,可以用列舉法列舉a、b。這個時候我們發現,0-9這10個數字所用的火柴數為:6,2,5,5,4,5,6,3,7,6,很明顯數字1用的火柴棒最少只要2根,不妨讓b為1,那麼a和c最多可以使用18根火柴,而c>=a,滿足條件的a的最大取值為1111。所以列舉a和b的範圍是從0~1111。
為了加快速度,可以將0到2222的所有整數需要的火柴棒數目提前算好儲存在陣列中。
先來理解一下題目;
火柴24根,加號和等號用去4根,剩下20根可以拼數字;這沒問題;
0-9這10個數字所用的火柴數為:6,2,5,5,4,5,6,3,7,6;數字1用的火柴棒最少只要2根;這沒問題;
如果b為1,那麼a和c最多可以使用18根火柴;這沒問題;20-2=18;
因為c>=a,滿足條件的a的最大取值為1111;為什麼a的最大取值為1111?大概是拼a最多能用8根;
列舉a和b的範圍是從0~1111;我還不太理解;
將0到2222的所有整數需要的火柴棒數目提前算好儲存在陣列中;不太理解;
下面根據網上程式做乙個win32版本;n=24;
#include #include "resource.h"
lresult callback windowprocedure (hwnd, uint, wparam, lparam);
hinstance hinst;
tchar szclassname = text("hcdemo");
int a[2223]=;
const int b[10]=;
int winapi
winmain (hinstance hthisinstance,
hinstance hprevinstance,
lpstr lpszargument,
int nfunsterstil)
return messages.wparam;}
lresult callback
windowprocedure (hwnd hwnd, uint message, wparam wparam, lparam lparam)
col=col+1;
row=0;
}wsprintf(szbuffer, "數目:%d",sum);
textout(hdc,1,1,szbuffer,lstrlen(szbuffer));
break;
case idm_about:
text ("hcdemo"), mb_ok | mb_iconinformation);
break;
case idm_exit:
destroywindow(hwnd);
break;
default:
return defwindowproc(hwnd, message, wparam, lparam);
}break;
case wm_create:
break;
case wm_paint:
hdc = beginpaint(hwnd, &ps);
getclientrect(hwnd, &rt);
endpaint(hwnd, &ps);
break;
case wm_destroy:
postquitmessage (0);
break;
default:
return defwindowproc (hwnd, message, wparam, lparam);
}return 0;
}int need(int n)
return num;
}
輸出如下;當n=24,方案數是128;
把程式裡面的a、b、c用加號和等號輸出了;結果如上;
此程式我還不太理解;程式裡面的a、b、c,可能是火柴棒根數;
源程式如下;有興趣自己研究;
#include using namespace std;
int a[2223]=;
const int b[10]=;
//計算自然數n所需要的火柴數
int need(int n)
return num;
}int main( )
}cout參閱網上相關資料或此;
工程;
資源和標頭檔案;
#include "resource.h"
#include /
//// menu
//idc_hcdemo menu
begin
popup "&file"
begin
menuitem "暴力列舉示例", idm_hc
menuitem "e&xit", idm_exit
endpopup "&help"
begin
menuitem "&about ...", idm_about
endend
#define idm_exit 10001
#define idm_about 10002
#define idc_hcdemo 10101
#define idd_aboutbox 10102
#define idm_hc 40001
槍俠(一道暴力題)
由於r l 10 r l 10 r l 1 0,所以考慮列舉每一段的長度len,又因為字符集並不大,根據抽屜原理,總共最多有51個段。所以我們列舉len,計算與每個點最早衝突的點的位置,就是把點按mod lenmod len modlen 分組。然後列舉起點,看每個起點可以往後擴充套件到什麼位置 用...
題解 一道數學題 加強版
題目傳送門 給出乙個二元函式,滿足 f k,x begin 1 x 1 sum f k,i x k x 1 end 給出 n,k 求出 f k,n n le 10 k le 10 6 借鑑了master.yi的思路 但是他裡面有個式子似乎寫錯了 我們首先可以得到轉移式 f k,x f k,x 1 x...
一道利用遞迴實現的集合列舉演算法題
有乙個集合m是這樣生成的 1 已知 k 是集合 m 的元素 2 如果 y 是 m 的元素,那麼,2y 1 和 3y 1 都是 m 的元素 3 除了上述二種情況外,沒有別的數能夠成為 m 的乙個元素。問題 任意給定 k 和 x,請判斷 x 是否是 m 的元素。這裡的 k是無符號整數,x 不大於 100...