換錢的方法數

2021-09-26 16:34:30 字數 1432 閱讀 5390

給定陣列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...