L3 001 湊零錢 dp 滿01揹包

2021-08-17 06:53:53 字數 1453 閱讀 2232

時間限制

200 ms

記憶體限制

65536 kb

**長度限制

8000 b

判題程式

standard

作者

陳越

輸入格式:

輸入第一行給出兩個正整數: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

/**

題意:能否剛好湊出m塊錢,並以字典序最小記錄路徑

題解:將錢幣從小到大排序,dp[i]記錄當湊出的錢為i時候用的硬幣個數。

可得到狀態轉移方程 dp[j] = max(dp[j],dp[j-cost]+1)

顯然,用的個數越多,字典序越小。所以相等的時候選擇dp[j-cost]+1;

令金額為cost,需要湊的錢為揹包容量,必須湊夠m塊錢,所以該問題為滿揹包問題。

滿揹包問題dp初始值設定為-inf,dp[0] = 0;

pre[i]記錄i錢數是由那個狀態得到的

*/#include#include#include#includeusing namespace std;

const int inf=0x3f3f3f3f;

stacks;

int dp[101];///所用硬幣個數

int pre[101];///i錢數是由那個狀態得到的

int a[10001];

int main(void)

dp[0]=0;

int n,m;

scanf("%d%d",&n,&m);

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

scanf("%d",&a[i]);

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

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

if(dp[m]>0)

printf("%d",k);

while(!s.empty())

printf("\n");

}else printf("no solution\n");

return 0;

}

L3 001 湊零錢 (01揹包)

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

L3 001 湊零錢(dfs或者01揹包)

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

天梯賽L3 001 湊零錢 (01揹包 dfs)

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