Anybody know the idea behind this problem?
I am a newbie in DP, help me.
This is the problem : problem
Thanks fellow.
# | User | Rating |
---|---|---|
1 | tourist | 3985 |
2 | jiangly | 3814 |
3 | jqdai0815 | 3682 |
4 | Benq | 3529 |
5 | orzdevinwang | 3526 |
6 | ksun48 | 3517 |
7 | Radewoosh | 3410 |
8 | hos.lyric | 3399 |
9 | ecnerwala | 3392 |
9 | Um_nik | 3392 |
# | User | Contrib. |
---|---|---|
1 | cry | 169 |
2 | maomao90 | 162 |
2 | Um_nik | 162 |
4 | atcoder_official | 161 |
5 | djm03178 | 158 |
6 | -is-this-fft- | 157 |
7 | adamant | 155 |
8 | awoo | 154 |
8 | Dominater069 | 154 |
10 | luogu_official | 150 |
Anybody know the idea behind this problem?
I am a newbie in DP, help me.
This is the problem : problem
Thanks fellow.
Name |
---|
Main idea:
If you know there are k ways to get c cents, then also you have found k ways to get c + m cents, where m is any valid coin value (1,5,10,25 and 50 for this problem).
It doesnt work here. For example dp[51] count 50 — 1 set and dp[55] count 50 — 5 set, then when we counting dp[56] we will say that dp[56] = dp[55] + dp[51] + ..., so we have just counted 50 — 5 — 1 set twice. So we need to count dp[sum][max_element] to avoid such result.
Yep, you are right. The sad thing is that I solved this problem before, what a fool I am :[
An interesting point, although I've just checked my solution to this problem and my DP variable was simply:
One thing to consider is that in order for this to work the dp states have to be calculated in order, each denomination at a time. For example, if we start by considering 1 cent, then
dp[1] += dp[0]
, thendp[2] += dp[1]
, etc. Then we could consider, for example, 5 cents, and the changes would be:dp[5] += dp[0]
,dp[6] += dp[1]
, etc. And the same for the rest of denominations.That way, each unique combination is counted once. Taking your example,
dp[56]
will certainly depend ondp[55]
,dp[51]
, etc. But whendp[55]
gets added todp[56]
, the denomination 5 has not been considered yet, sodp[55]
is not counting [50 — 5] (given the order chosen above, but selecting the denominations in any order works). [50 — 5 — 1] will only be counted later, whendp[56] += dp[51]
is executed. I hope this is not too confusing.Anyway, the main idea behind this process does seem to me like what sergioRG described.
Thanks for your response,
But i still confuse with the explanation. More elaboration would be pleased.
Let me Count the Ways (UVa 357) is an instance of a classic problem known as "coin change", with a well-known DP solution. I'd recommend investing a little time searching the web about it, because that way you may find a few references written in a style that "clicks" with you.
As a starting point, a good introduction is, for example: http://www.algorithmist.com/index.php/Coin_Change
Hope it helps.
dp[0][0..30000] — combinations to get X cents with 1-cent & 2-cent coins
dp[1][0..30000] — combinations to get X cents with 1, 2, 5
dp[2][0..30000] — combinations to get X cents with 1, 2, 5, 25
dp[3][0..30000] — combinations to get X cents with 1, 2, 5, 25, 50
My bad
There are [1,5,10,25,50] coins in the problem, my solution is for [1,2,5,25,50].
But the idea remains the same, dp[0][X] (1- & 5- cent) would be X / 5 + 1.
Thanks for the great elaboration.
Actually I'm still confuse, maybe it's too fast to me to learn DP. I will get some sources, and do some self-study on it.
Lookup this course on Coursera: https://www.coursera.org/course/algo2
DP is explained very well there, was a good starter for me.
Sorry, isn't there something similar but in Russian?
Try understand this first. I think this should be clear enough
http://www.geeksforgeeks.org/dynamic-programming-set-7-coin-change/