題目1
給定陣列arr,arr中所有的值都為正數且不重複。每個值代表一種面值的貨幣,每種貨幣都可以使用任意張,再給定乙個整數aim代表要找的錢數,求組成aim的最少貨幣數。
dp[i][j] 表示前i中貨幣組成錢數j所用的最小貨幣數,那麼dp[i][j] 等於 min(dp[i-1][j],dp[i][j-array[i]]+1) dp[i-1][j] 就是前乙個貨幣組成錢數j所用的最小貨幣數
dp[i][j-array[i]]+1 就是當前貨幣組成錢數j最小數
int mincoins1(vector&v, int aim)
if (aim == 0)
return 0;
int n = v.size();
int max_int = numeric_limits::max();
vector> dp(n, vector(aim+1));
for (int j = 1; j <= aim; j++) }
int left = 0;
for (int i = 1; i < n; i++)
dp[i][j] = min(left, dp[i-1][j]);
} }return dp[n - 1][aim] != max_int ? dp[n - 1][aim] : -1;
}
優化
int mincoins2(vector&v, int aim)
if (aim == 0)
return 0;
int n = v.size();
int max_int = numeric_limits::max();
vectordp(aim + 1);
for (int j = 1; j <= aim; j++) }
int left = 0;
int tmp = 0;
for (int i = 1; i < n; i++)
dp[j] = min(left, tmp);
} }return dp[aim] != max_int ? dp[aim] : -1;
}int main()
; int n = mincoins1(v, 10);
n = mincoins2(v, 10);
return 0;
}
題目2
給定陣列arr,arr中所有的值都為正數,且不重複。每個值代表一種面值的貨幣,每種面值的貨幣可以使用任意張,再給定乙個整數aim代表要找的錢數,求換錢有多少種方法。
暴力遞迴法
int process(std::vector& arr, int index, int aim)
else }
return ret;
}int exchangemoney(std::vector& arr, int aim)
if (arr.size() == 0)
return process(arr, 0, aim);
}
記憶搜尋方法
int process1(std::vector& arr, int index, int aim,
std::map, int>& resultmap)
else
else
}resultmap[make_pair(index, aim)] = ret;
}return ret;
}int exchangemoney1(std::vector& arr, int aim)
if (arr.size() == 0)
std::map, int> resultmap;
return process1(arr, 0, aim, resultmap);
}int main()
; int n = exchangemoney1(v, 10);
n = exchangemoney(v, 10);
return 0;
}
動態規劃法
int exchangemoney2(std::vector& arr, int aim)
if (arr.size() == 0)
int n = arr.size();
vector> dp(n, vector(aim + 1));
//dp[i][j]表示使用arr[0...i]組成j的方法數
for (int i = 0; i= 0 ? dp[i][j - arr[i]] : 0;//先用一張arr[i],剩下arr[0...i]組成j-arr[i]
} }return dp[n - 1][aim];//arr[0...n]組成aim的方法數
}
最少貨幣數問題
給定陣列arr,arr中所有的值都為正數且不重複。每個值代表一中面值的貨幣,每種面值的貨幣可以使用任意張,再給定乙個整數aim代表要找的錢數,求組成aim的最少貨幣數。採用動態規劃的思想來解此題。首先設定dp i j 陣列,i的意思是當前的最大貨幣數,j的意思是目標貨幣數。因此dp i j 的意思就...
換錢最少貨幣數
給定陣列arr,arr中所有的值都為正數且不重複。每個值代表一種面值的貨幣,每種面值的貨幣可以使用任意張,在給定乙個整數aim代表要找的錢數,求組成aim的最少貨幣數。public class mincoins int len arr.length int max integer.max value...
換錢的最少貨幣數
題目 給定陣列arr,arr中所有的值都為正數且不重複。每個值代表一種面值的貨幣,每種面值的貨幣可以使用任意張,再給定乙個整數aim代表要找的錢數,求組成aim的最少貨幣數。舉例 arr 5,2,3 aim 20。4張5元可以組成20元,其他的找錢方案都要使用更多張的貨幣,所以返回4。arr 5,2...