時間限制
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輸出樣例1:5 9 8 7 2 3 4 1
1 3 5輸入樣例2:
4 8輸出樣例2:7 2 4 3
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 個空格分隔,行首尾不得有...