題目:稱砝碼——現有一組砝碼,重量互不相等,分別為m1,m2,m3…mn;每種砝碼對應的數量為x1,x2,x3...xn。現在要用這些砝碼去稱物體的重量,問能稱出多少中不同的重量。
注:重量包括0
輸入描述:
輸入包含多組測試資料。
對於每組測試資料:
第一行:n --- 砝碼數(範圍[1,10])
第二行:m1 m2 m3 ... mn --- 每個砝碼的重量(範圍[1,2000])
第三行:x1 x2 x3 .... xn --- 每個砝碼的數量(範圍[1,6])
輸出描述:
利用給定的砝碼可以稱出的不同的重量數
輸入例子:
21 2
2 1輸出例子:
5解答:
事實上就是求
sum = m[0]*x[0]+m[1]*x[1]+m[2]*x[2]+
m[3]*x[3]+m[4]*x[4]+m[5]*x[5]+
m[6]*x[6]+m[7]*x[7]+m[8]*x[8]+
m[9]*x[9]
的x[i]的值從0增長到x[i]的所有的可能的值。
我將sum存入vector中,每次得到乙個值,檢查是否重複,最後輸出sum的size。
在求sum的時候,用了三層迴圈:
第一層迴圈了x數列中所有的元素+1之後相乘的值,這是所有的可能性。比如例子中,重量1的有2個,重量2的有1個,則所有的可能性有一共(2+1)*(1+1)六種。
第二層擬合m[i]*x[i],其中,為了讓x[i]依次變動,我將稱號後面的這個值改為((x[i] - j) % (round / chushu)),這樣每個x[i]就像進製一樣依次變動,遍歷所有的可能性。式子中的chushu在第三層迴圈。
第三層計算每個((x[i] - j) % (round / chushu))的chushu是多少。x[0]的chushu對應的是x[0],x[1]對應的是x[0]*x[1],以此類推。
1 #include 2 #include3 #include 4
using
namespace
std;
5int
main() , x[10] = ;
9 vector sum = ;
10 cin >>n; //得到n
11for (auto i = 0; i < n; i++)
1215
for (auto i = 0; i < n; i++)
1620
for (auto j = 0; j != round; j++) //每種可能計算一次
2130
}31 littlesum += m[i] * ((x[i] - j) % (round /chushu)); //計算該種可能性的一部分
32 chushu = 1
; //除數置133}
34for
(auto x: sum)
3541}42
if(flag)
4346 flag = true
;47 littlesum = 0
;48 chushu = 1;49
}50 cout <51 }
感覺自己做的太麻煩,肯定有更快的演算法,我去找找有沒有大神分享出來。
每日程式設計 (三十)
題目描述 給定 pushed 和 popped 兩個序列,只有當它們可能是在最初空棧上進行的推入 push 和彈出 pop 操作序列的結果時,返回 true 否則,返回 false 示例 1 輸入 pushed 1,2,3,4,5 popped 4,5,3,2,1 輸出 true 解釋 我們可以按以...
每日程式設計 31
題目描述 有n個房間,現在i號房間裡的人需要被重新分配,分配的規則是這樣的 先讓i號房間裡的人全都出來,接下來按照 i 1,i 2,i 3,的順序依此往這些房間裡放乙個人,n號房間的的下乙個房間是1號房間,直到所有的人都被重新分配。現在告訴你分配完後每個房間的人數以及最後乙個人被分配的房間號x,你需...
每日程式設計(36)
題目描述 矩形以列表 x1,y1,x2,y2 的形式表示,其中 x1,y1 為左下角的座標,x2,y2 是右上角的座標。如果相交的面積為正,則稱兩矩形重疊。需要明確的是,只在角或邊接觸的兩個矩形不構成重疊。給出兩個矩形,判斷它們是否重疊並返回結果。示例 1 輸入 rec1 0,0,2,2 rec2 ...