找錢最少貨幣數

2021-09-25 22:00:23 字數 2499 閱讀 8819

題目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...