Buying Apples!
Link to the question : ABA12C
HINT :
This is a problem of unbounded knapsack.
We will maintain an array ans[ k+1 ] where the j th index stores the minimum money required to buy j kg of apples.
To find the optimal ans[ j ] , we need to decide whether to select or reject an instance of weight 'i'.
If we reject all the weights then ans[ j ] = price[ j ], and if we select 'i' then
ans[ j ] = minimum[ ans[j - i] + price[ i ] ] for i= 0,1....j-1.
You can look into the source code for a better understanding.
RECOMMENDED QUESTION :
Try your hands on this dp question : Morena
SOLUTION :
/* ABA12C - Buying Apples */
/* Sushant Gupta */
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,k,b;
scanf("%d%d",&n,&k);
b =k;
int p[k +1];
int i,j;
for( i=1; i<=k; i++ )
scanf("%d",&p[i]);
int ans[k+1];
for(i=1; i<=k; i++)
{
//if(p[i] == -1)
// ans[i] = INT_MAX;
//else
ans[i] = p[i];
}
for(i=2; i<=k; i++)
{
for(j=1; j<i; j++)
{
if(p[i-j] == -1 || ans[j] == -1)
continue;
if(ans[i] == -1)
ans[i] = ans[j] + p[i-j];
else
ans[i] = min(ans[i], ans[j] + p[i-j]);
}
}
if(k==0)
printf("0\n");
else
printf("%d\n",ans[k]);
}
return 0;
}
can you explain this line-- ans[ j ] = minimum[ ans[j - i] + price[ i ] ] for i= 0,1....j-1.
ReplyDeleteThis means that, for eg if I need to buy apples of weight 5kg, then to find ans[5] I have several options like buy 5 packets of 1 kg or buy 1 packet of 2kg and 1 of 3kg etc.
DeleteHence in order to find the best case, I run a loop from (i =0 to i<j) and find the combination which costs the minimum. So ans[j] will be minimum of either ans[j] , i.e, I do not choose the ith packet, or ans[j-i] + price[i], i.e, I have chosen the ith packet.
For further reading on unbounded knapsack, you can refer this site :
http://www.csegeek.com/csegeek/view/tutorials/algorithms/dynamic_prog/dp_part7.php
its wrong sol...u r not considering n anywhere which is the max amt of packets u can buy
ReplyDeletefor test case : 1 5 1 3 4 5 6 the ans should be 6 but ur code is giving 5.
Read the comments in the question. Many users have written that if they considered 'n' then they got a WA but without considering it their solution got AC.
DeleteHence, even I did not consider it.
How does that mean we have not found the answer yet?
DeleteOkay the complexity of this solution is K^2 right? In case we consider n, it will increase to O((K^2)*N) right?
ReplyDeleteYeah, I think the complexity should be O(k*k*n) although I have not tried it yet.
Deletecan you explain the line----->
ReplyDeleteif(p[i-j] == -1 || ans[j] == -1)
continue;
p[ i ] denotes the price of i kg apples. So as per the question p[i] can be equal to -1. ans[i] denotes the minimum to cost to buy i kg of apples. If ans[j] = -1, then that means that for the following j we have not found the answer yet. So in either of the cases let the for loop continue.
DeleteIn your code, you write: ans[i] = min(ans[i], ans[j] + p[i-j]);
ReplyDeleteI think it must be ans[i]=min(ans[i],ans[i-j]+p[j]);
Although Both of them can be true, I think the second one is more comfortable.