7 68 湊零錢 30分

2021-10-01 15:33:28 字數 1431 閱讀 5656

輸入格式:

輸入第一行給出兩個正整數:nnn(≤104\le 10^4≤10​4​​)是硬幣的總個數,mmm(≤102\le 10^2≤10​2​​)是韓梅梅要付的款額。第二行給出 nnn 枚硬幣的正整數面值。數字間以空格分隔。

輸出格式:

在一行中輸出硬幣的面值 v1≤v2≤⋯≤vkv_1 \le v_2 \le \cdots \le v_kv​1​​≤v​2​​≤⋯≤v​k​​,滿足條件 v1+v2+…+vk=mv_1 + v_2 + … + v_k = mv​1​​+v​2​​+…+v​k​​=m。數字間以 1 個空格分隔,行首尾不得有多餘空格。若解不唯一,則輸出最小序列。若無解,則輸出 no solution。

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

8 95 9 8 7 2 3 4 1

輸出樣例 1:

1 3 5

輸入樣例 2:

4 8

7 2 4 3

輸出樣例 2:

no solution

最簡單的dfs演算法,排序後往後乙個個狠狠的搜就好了

#include

using

namespace std;

int f[

10005];

int num=

0,n,m;

int flag=0;

int road[

10005];

int cnt=0;

void

bfs(

int r,

int sum)

for(

int i=r+

1;i)return;}

intmain()

}if(sumsort

(f,f+num)

;bfs(-

1,0)

;if(!flag)

cout<<

"no solution"

}

dp核心**

sort

(f+1

,f+1

+n,greater<

int>()

);for(

int i=

1;i<=n;i++)}

}

7 1 湊零錢 30分

8 9 5 9 8 7 2 3 4 1 1 3 5 4 8 7 2 4 3 no solution 動態規劃,先對硬幣價值公升序排序,從左向右依次選取硬幣,對於每個硬幣都有兩種情況,取或不取,當所取硬幣總額等於所需總額時,輸出 因為已經公升序排序,所得的第一組資料就是最小序列 以此進行遞迴。測試點6...

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