給定陣列arr,設陣列長度為n,arr中所有的值都為正整數且不重複。每個值代表一種面值的貨幣,每種面值的貨幣可以使用任意張,再給定乙個整數aim,代表要找的錢數,求換錢的方法數有多少種。由於方法的種數比較大,所以要求輸出對10^9+7進行取模後的答案。
輸出包括兩行,第一行包括兩個整數n(0≤n≤1000)和aim(0≤aim≤20000)。第二行包含n個整數,表示arr陣列(1≤arri≤1e9)。
輸出乙個整數,表示換錢的方法數對10^9+7取模後的答案。
示例1
4 15 5 10 25 1
6
示例2
5 1000
2 3 5 7 10
20932712
時間複雜度o(n∗aim),空間複雜度o(aim)。
//方法1:暴力列舉
//執行超時:您的程式未能在規定時間內執行結束,請檢查是否迴圈有錯或演算法複雜度過大。
//case通過率為0.00% 示例1可通過,vs2017
#includeusing namespace std;
const int number=1000000007;
int process(vector& arr,int i,int rest)
int res=0;
for(int k=0;k*arr[i]<=rest;k++)
return res;
}int main()
coutconst int number=1000000007;
vector> memo;
int process(vector& arr,int i,int rest)
if(memo[i][rest]!=-1)
int res=0;
for(int k=0;k*arr[i]<=rest;k++)
memo[i][rest]=res;
return res;
}int main()
memo=vector>(n,vector(aim+1,-1));
coutconst int number=1000000007;
int main()
vector> dp(n,vector(aim+1,0));
for(int i=0;i=0)}}
coutconst int number=1000000007;
int main()
vectordp(aim+1,0);
dp[0]=1; //對於錢數為0,有1種方法
for(int i=0;i}
cout
}
換錢的方法數
題目 給定陣列arr,arr中所有的值都為整數且不重複。每個值代表一種面值的貨幣,每種面值的貨幣可以使用任意張,再給定乙個整數代表要找的錢數,求換錢有多少種方法。舉例 arr 5,10,25,1 aim 0 組成0元的方法有1種,就是所有面值的貨幣都不用。所以返回1。arr 5,10,25,1 ai...
換錢的方法數
1.給定陣列arr,arr中所有的值都為正數且不重複。每個值代表一種面值的貨幣,每種貨幣都可以使用任意張,再給定乙個整數aim代表要找的錢數,求組成aim的最少貨幣數。方法一 暴力遞迴 遞迴部分 a index i就是用幾張a index process a,0,target defprocess ...
換錢的方法數
題目 給定陣列arr,所有元素都為正數且不重複。每個值代表一種面值的貨幣,每種面值的貨幣可以使用任意張,再給定乙個整數aim代表要找的錢數,求換錢有多少種方法。舉例 arr 5,10,25,1 aim 0 返回1。組成0元的方法有一種,即所有貨幣都不用 arr 3,5 aim 2 返回0。無法組成2...