-1
A
回答
7
這是最小的硬幣變化的問題,其中所述硬幣是[1,4,9,...,(ceil(sqrt(n)))^2]
。
它可以使用Dynamic Programming (DP)由下列遞推公式解決:
D(i,0) = 0
D(i,x) = infinity x<0
D(0,x) = infinity x>0
D(i,x) = min { D(i,x-i^2) + 1, D(i-1,x) }
當建立您的矩陣(假定自下而上DP),在D(ceil(sqrt(n)),n)
在矩陣表示的元素爲「硬幣的最小數「(平方數)需要建立你的輸入號碼。
獲取實際元素是通過在構建矩陣後跟蹤您在矩陣中的選擇來完成的,並且在每個點檢查您是否添加了加法或不加。
對this thread和this thread中的類似問題進行了更詳細的解釋。
+1
[Min-Coin Change](http://www.algorithmist.com/index.php/Min-Coin_Change)精確。 ([Coin Change](http://www.algorithmist.com/index.php/Coin_Change)通常是查找不同可能性的數量。) – aioobe
0
下面是該問題的可視化基本解決方案。 需要進行編輯以緩存中間答案,以便算法顯着更快。目前...只有大約40到50的值才能被快速計算出來。這是完全正常工作和測試。它只返回最短的答案,以及其中較高值在其他值左側的答案。
Private Function ShortestSquareSum(x As Integer) As Integer()()
If x < 0 Then
Throw New ArgumentException("Parameter cannot be negative.", "x")
ElseIf x = 0 Then
Return New Integer()() {New Integer() {}}
Else
Dim answers As New List(Of Integer())
Dim shortest As Integer? = Nothing
For y As Integer = Math.Floor(Math.Sqrt(x)) To 1 Step -1
Dim remaining As Integer = x - y * y
Dim tempAnswers As Integer()() = ShortestSquareSum(x - y * y)
For Each answer As Integer() In tempAnswers
Dim currentAnswer As New List(Of Integer)
currentAnswer.Add(y)
currentAnswer.AddRange(answer)
If Not shortest.HasValue OrElse currentAnswer.Count < shortest Then
shortest = currentAnswer.Count
answers.Clear()
answers.Add(currentAnswer.ToArray())
ElseIf currentAnswer.Count = shortest AndAlso (answer.Count = 0 OrElse y > answer(0)) Then
answers.Add(currentAnswer.ToArray())
End If
Next
Next
Return answers.ToArray()
End If
End Function
0
public static void shortest_square(int n)
{
int i=2;
List<Integer> list= new ArrayList<Integer>();
while(i<=n) || n!=0)
{
if(n%(i*i)==0)
{
n=n-(i*i);
list.add(i);
}
else
{
i++;
}
}
System.out.println(list);
}
相關問題
- 1. 查找最短路徑的僞代碼
- 2. 查找不平衡括號和括號
- 3. 查找N個號碼中的最大號碼和第二大號碼
- 4. 找到最高和最低的號碼
- 5. 找到用戶輸入的最大號碼和最小號碼(方法)
- 6. 查找最大號碼的地址
- 7. 尋找最小的「分解」方號碼
- 8. 查找和spilit號碼
- 9. 最短方法查找單詞的最小和最大長度陣列
- 10. 最短路徑查找器
- 11. 在大列表中查找重複號碼的最快方法
- 12. PSEUDO代碼和Python用於查找最大,第二大和最小號碼
- 13. 查找號碼
- 14. 查找號碼
- 15. 查找號碼
- 16. 通過最短前綴的組號碼
- 17. 查找計算平方和的最小開銷
- 18. 陣列最大號碼查找器
- 19. 短碼和符號在python
- 20. 查找多個人的最短和最長時間
- 21. 查找模平方
- 22. 查找號碼括號內
- 23. 查找矩陣中的最短路徑
- 24. 查找DLV中的最短路徑
- 25. 在Python中查找最大帶符號短整數
- 26. 查找IMEI號的代碼
- 27. 查找Kaprekar的號碼
- 28. 如何查找號碼列表中的最小值和最大值
- 29. 查找值的平均值,最大值和最小值進入
- 30. 尋找最小和最大的人口和平均水平
我想你應該試着在這裏發表您的問題,而不是:http://math.stackexchange.com/ – Alex
甚至更好,只是嘗試着自己首先要解決你的功課,然後張貼在這裏,如果你被困住了。 – biziclop
而我絕對不會推薦math.stackexchange.com,這將是有問題的話題。 – biziclop