Ribbon負載均衡服務呼叫&CAS
阿新 • • 發佈:2020-10-09
題目:
觀察這個數列:
1 3 0 2 -1 1 -2 ...
這個數列中後一項總是比前一項增加2或者減少3。
棟棟對這種數列很好奇,他想知道長度為 \(n\) 和為 \(s\) 而且後一項總是比前一項增加\(a\)或者減少\(b\)的整數數列可能有多少種呢?
分析:
轉換為01揹包問題求解。
設首項為\(t\),將加\(a\)減$b 記作 \(F(i)=(a,-b)\)
1 t 2 t+F(1) 3 t+F(1)+F(2) 4 t+F(1)+F(2)+F(3) ... n t+F(1)+F(2)+F(3)+...+F(n-1) //前n項和 SUM(n) s=n*t+(n-1)F(1)+(n-2)F(2)+....+F(n-1)
所以:\(n*t =s-((n-1)F(1) + (n-2)F(2) +...+F(n-1))\)
由於\(F(i)\)不是\(a\)就是\(b\),因此我們假設\(a\)的個數為c。
\(F(i)\)的個數為\(n-1,n-2,...2,1\)也就是\(n*(n-1)/2\)個。即b的個數為\(n*(n-1)/2-c\)個。
所以:令\(temp=s-c*a+((n-1)*n/2-c)*b\)
當\(temp%n==0\)時,說明\(temp==n*t\),滿足要求。
\(c\)為的大小取決於\(1,2,...n-1\)若干個數組合的方案數。
ij 0 1 2 3 4 5 6 7 8 9 0 1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 2 1 1 1 1 0 0 0 0 0 0 3 1 1 1 2 1 1 1 0 0 0
上表是\(n=4,s=10\)的動態規劃結果。每一項都是\((i,j)\)條件下的方案數。
程式碼: