L3 001 湊零錢(揹包dp,輸出路徑)

2021-08-17 21:27:45 字數 1037 閱讀 3846

輸入格式:

輸入第一行給出兩個正整數:n(<=104)是硬幣的總個數,m(<=102)是韓梅梅要付的款額。第二行給出n枚硬幣的正整數面值。數字間以空格分隔。

輸出格式:

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

<= v2

<= ... <= vk,滿足條件 v1 + v2 + ... + vk = m。數字間以1個空格分隔,行首尾不得有多餘空格。若解不唯一,則輸出最小序列。若無解,則輸出「no solution」。

注:我們說序列比「小」,是指存在 k >= 1 使得 a[i]=b[i] 對所有 i < k 成立,並且 a[k] < b[k]。

輸入樣例1:

8 9

5 9 8 7 2 3 4 1

輸出樣例1:
1 3 5
輸入樣例2:
4 8

7 2 4 3

輸出樣例2:
no solution

考點:  揹包dp

題解:把要付款金額當成揹包容量,求能否恰好裝滿時。

多個解時,要求硬幣金額盡量小。可以先把面值排序,從小到大取。

輸出路徑!參考《演算法導論》。

#include#define inf 0x3f3f3f3f

using namespace std;

const int maxn=10000+10;

int dp[maxn];

int pre[maxn];

int w[maxn];

void print(int x)

} int main()

sort(w+1,w+1+n);

for(int i=1; i<=n; i++)}}

if(dp[m]<0)

puts("no solution");

else print(m);

}

L3 001 湊零錢 (揹包輸出路徑)

時間限制 200 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越輸入格式 輸入第一行給出兩個正整數 n 104 是硬幣的總個數,m 102 是韓梅梅要付的款額。第二行給出n枚硬幣的正整數面值。數字間以空格分隔。輸出格式 在一行中輸出硬幣的面值 v1...

L3 001 湊零錢 (01揹包)

時間限制 200 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越 輸入格式 輸入第一行給出兩個正整數 n 104 是硬幣的總個數,m 102 是韓梅梅要付的款額。第二行給出n枚硬幣的正整數面值。數字間以空格分隔。輸出格式 在一行中輸出硬幣的面值 v...

L3 001 湊零錢 dp 滿01揹包

時間限制 200 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越 輸入格式 輸入第一行給出兩個正整數 n 104 是硬幣的總個數,m 102 是韓梅梅要付的款額。第二行給出n枚硬幣的正整數面值。數字間以空格分隔。輸出格式 在一行中輸出硬幣的面值 v...