時間限制
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
#include using01namespace
std;
#define maxn 11000
intvis[maxn];
ints[maxn];
inttmp[maxn];
intn, m;
intcnt;
intflag;
intall;
void dfs(int index,int sum, int cnt,int tol)//
tol 為剩餘的錢數
for(int i = index + 1; i < n; i++)
} } int
main()
sort(s, s +n);
cnt = 0
; dfs(-1,0
, cnt,all);
if(!flag)
printf(
"no solution\n
");
}
本來揹包判斷是否存在,然後dfs的 但是只有28分 然後學了下記錄路徑
b[sum]=a[i] 就是代表 sum的錢=a[i]+b[ sum-a[i] ] 這樣遞迴下去 直接sum=0 這樣就得到路徑了
#include using我28分的dfsnamespace
std;
int dp[10005
];int b[10005
];int a[10005];
void dfs(int
t) dfs(t-b[t]);
printf("%d
",b[t]);}
intmain()}}
}if(!b[m])
puts(
"no solution");
else dfs(m),puts(""
);
return0;
}
#include#includeview code#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
int a[10005
];bool v[10005
];int c[10005
];int k=1
;
intn,m;
bool f=0
;void display(ints)}
void dfs(int sum,int
s)
for(int i=1;i<=k-1;i++)
}}int
main()
sort(a+1,a+k);
dfs(
0,1);
if(!f) cout<
no solution";
}
L3 001 湊零錢 dfs 剪枝或者01揹包
輸入第一行給出兩個正整數 n 10 4 是硬幣的總個數,m 10 2 是韓梅梅要付的款額。第二行給出 n 枚硬幣的正整數面值。數字間以空格分隔。在一行中輸出硬幣的面值 v 1 v 2 v k 滿足條件 v 1 v 2 v k m。數字間以 1 個空格分隔,行首尾不得有多餘空格。若解不唯一,則輸出最小...
L3 001 湊零錢 30分 (DFS)
輸入格式 輸入第一行給出兩個正整數 n 1e4 是硬幣的總個數,m 1e 2 是韓梅梅要付的款額。第二行給出 n 枚硬幣的正整數面值。數字間以空格分隔。輸出格式 在一行中輸出硬幣的面值 v 1 v 2 vk 滿足條件 v 1 v2 v k m。數字間以 1 個空格分隔,行首尾不得有多餘空格。若解不唯...
L3 001 湊零錢 (01揹包)
時間限制 200 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越 輸入格式 輸入第一行給出兩個正整數 n 104 是硬幣的總個數,m 102 是韓梅梅要付的款額。第二行給出n枚硬幣的正整數面值。數字間以空格分隔。輸出格式 在一行中輸出硬幣的面值 v...