輸入第一行給出兩個正整數: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] 對所有i89
5987
2341
1
35
487
243
no solution
這原本是0-1揹包問題,只是需要輸出序列而變得複雜。需要注意下面對dp的搜尋。感覺這點學到了不少,對揹包又有了一些理解#include
#include
#include
using
namespace std;
int a[
10010];
int dp[
110]
;bool cho[
10010][
110]
;bool
cmp(
int a,
int b)
intmain()
}}if(dp[m]
!= m)
j = m; i = n;
while
(j >0)
i--;}
return0;
}
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 個空格分隔,行首尾不得有多餘空格。若...