L3 001 湊零錢 30 分

2021-09-28 15:14:59 字數 1446 閱讀 7394

輸入格式:

輸入第一行給出兩個正整數:n(≤10

​4​​ )是硬幣的總個數,m(≤10

​2​​ )是韓梅梅要付的款額。第二行給出 n 枚硬幣的正整數面值。數字間以空格分隔。

輸出格式:

在一行中輸出硬幣的面值 v

​1​​ ≤v

​2​​ ≤⋯≤v

​k​​ ,滿足條件 v

​1​​ +v

​2​​ +…+v

​k​​ =m。數字間以 1 個空格分隔,行首尾不得有多餘空格。若解不唯一,則輸出最小序列。若無解,則輸出 no solution。

注:我們說序列比「小」,是指存在 k≥1 使得 a[i]=b[i] 對所有 i輸入樣例 1:

8 95 9 8 7 2 3 4 1

輸出樣例 1:

1 3 5

輸入樣例 2:

4 87 2 4 3

輸出樣例 2:

no solution

注意:

1:大於m的數不要。

2:從小到大的序列,總和小於m的不行。(碰巧最後乙個測試點就是這樣,不然,超時)

解答:

#include

#include

#include

#define max 100000

#define foreach(a,b,c) for((a)=(b); (a)<(c); (a)++)

using

namespace std;

int n,m;

vector<

int> arr;

bool flag =

false

;int record[max]

=,rindex=0;

void

ergodic

(int level,

int sum,

int index)

;int

main()

}if(tm < m)

n =(int

)arr.

size()

;sort

(arr.

begin()

,arr.

end())

;ergodic(0

,0,0

);if(flag)}}

else

return0;

}void

ergodic

(int level,

int sum,

int index)

int i;

foreach

(i,level,n)

else

if(sum+arr[i]

== m)

else

if(flag)

}}

L3 001 湊零錢 (30 分)

輸入第一行給出兩個正整數 n 10 4 是硬幣的總個數,m 10 2 是韓梅梅要付的款額。第二行給出 n 枚硬幣的正整數面值。數字間以空格分隔。在一行中輸出硬幣的面值 v 1 v 2 v k 滿足條件 v 1 v 2 v k m。數字間以 1 個空格分隔,行首尾不得有多餘空格。若解不唯一,則輸出最小...

L3 001 湊零錢 30 分

題目鏈結 這種選和不選的題最好用遞迴做了,但是需要剪枝,然後就是對特殊情況的考慮,不然會超時。注意當陣列中所有數的和加起來都達不到目標值,就沒必要搜尋了,直接輸出無解 include using namespace std const int maxn 1e4 5 const int maxx 1e...

L3 001 湊零錢 30分

輸入第一行給出兩個正整數 n 10 4 是硬幣的總個數,m 10 2 是韓梅梅要付的款額。第二行給出 n 枚硬幣的正整數面值。數字間以空格分隔。輸出格式 在一行中輸出硬幣的面值 v 1 v 2 v k 滿足條件 v 1 v 2 v k m。數字間以 1 個空格分隔,行首尾不得有多餘空格。若解不唯一,...