// ASSIGNMENT-6 Question-2 ID:201601084 Patel Kshitij
//It is a CPP file..... change extention from .txt to .cpp
//NOTE: 1. This question takes huffman bit-length as input (which works as weight for 01 knapsack), as mentioned in question
// 2. Huffman code is available from a different company(as mentioned in question),... so that it gives bit-length for items
// corresponding to it's frequencies............(here, it is directly taken as input(step 1))
// 3. W in the main program, is length of the invoice file(used for looting items), which works as knapsack capacity
// 4. unbounded Knapsack is used because as mentioned in question, we can loot any number(infinite stock of item is available)
// of any item,....(clearly mentioned in question that: quantity of item is not fixed, we have full stock available)
#include <bits/stdc++.h>
using namespace std;
int unboundedKnapsack(int W, int n, int val[], int wt[]) //see step 4 in above comments
{
// dp[i] is going to store maximum value
// with knapsack capacity i.
int dp[W+1];
memset(dp, 0, sizeof dp);
int ans = 0;
// Fill dp[] using above recursive formula
for (int i=0; i<=W; i++)
for (int j=0; j<n; j++)
if (wt[j] <= i)
dp[i] = max(dp[i], dp[i-wt[j]]+val[j]);
return dp[W];
}
void sort(char *item, int *wt, int *val, int n){ //sorting function for arranging values in decreasing order...
int i,j; //of value/weight ......
for(i=0;i<n;i++){
for(j=0;j<n-i-1;j++){
if((double)val[j]/wt[j]<(double)val[j+1]/wt[j+1]){
int v=val[j],w=wt[j];
char c=item[j];
val[j]=val[j+1]; wt[j]=wt[j+1];item[j]=item[j+1];
val[j+1]=v,wt[j+1]=w,item[j+1]=c;
}
}
}
}
int main()
{
char item[] = { 'a', 'b', 'c', 'd', 'e', 'f' }; //items
int huffman_len[]={4,4,3,3,3,1}; //corresponding bit-length lengths(works as weights for 01 knapsack)
int fin_val[]={15,25,12,25,1,15}; //values corresponding to items
int size = sizeof(item) / sizeof(item[0]);
int W=13; //It is bit-length of invoice file
//for(int i=0;i<6;i++) printf("item=%c len=%d fin_val=%d\n",item[i],huffman_len[i],fin_val[i]);
sort(item,huffman_len,fin_val,size);
//printf("\nAfter sorting in decreasing order of val/wt\n");
//for(int i=0;i<6;i++) printf("item=%c len=%d fin_val=%d\n",item[i],huffman_len[i],fin_val[i]);
printf("Maximum value of loot possible within given stipulated bits=%d ",unboundedKnapsack(W,size,fin_val,huffman_len));
return 0;
}
Ly8gQVNTSUdOTUVOVC02ICBRdWVzdGlvbi0yICAgSUQ6MjAxNjAxMDg0ICAgICAgUGF0ZWwgS3NoaXRpagovL0l0IGlzIGEgQ1BQIGZpbGUuLi4uLiBjaGFuZ2UgZXh0ZW50aW9uIGZyb20gLnR4dCB0byAuY3BwCi8vTk9URTogMS4gVGhpcyBxdWVzdGlvbiB0YWtlcyBodWZmbWFuIGJpdC1sZW5ndGggYXMgaW5wdXQgKHdoaWNoIHdvcmtzIGFzIHdlaWdodCBmb3IgMDEga25hcHNhY2spLCBhcyBtZW50aW9uZWQgaW4gcXVlc3Rpb24KLy8gICAgICAyLiBIdWZmbWFuIGNvZGUgaXMgYXZhaWxhYmxlIGZyb20gYSBkaWZmZXJlbnQgY29tcGFueShhcyBtZW50aW9uZWQgaW4gcXVlc3Rpb24pLC4uLiBzbyB0aGF0IGl0IGdpdmVzIGJpdC1sZW5ndGggZm9yIGl0ZW1zCi8vICAgICAgICAgY29ycmVzcG9uZGluZyB0byBpdCdzIGZyZXF1ZW5jaWVzLi4uLi4uLi4uLi4uKGhlcmUsIGl0IGlzIGRpcmVjdGx5IHRha2VuIGFzIGlucHV0KHN0ZXAgMSkpCi8vICAgICAgMy4gVyBpbiB0aGUgbWFpbiBwcm9ncmFtLCBpcyBsZW5ndGggb2YgdGhlIGludm9pY2UgZmlsZSh1c2VkIGZvciBsb290aW5nIGl0ZW1zKSwgd2hpY2ggd29ya3MgYXMga25hcHNhY2sgY2FwYWNpdHkKLy8gICAgICA0LiB1bmJvdW5kZWQgS25hcHNhY2sgaXMgdXNlZCBiZWNhdXNlIGFzIG1lbnRpb25lZCBpbiBxdWVzdGlvbiwgd2UgY2FuIGxvb3QgYW55IG51bWJlcihpbmZpbml0ZSBzdG9jayBvZiBpdGVtIGlzIGF2YWlsYWJsZSkKLy8gICAgICAgICBvZiBhbnkgaXRlbSwuLi4uKGNsZWFybHkgbWVudGlvbmVkIGluIHF1ZXN0aW9uIHRoYXQ6IHF1YW50aXR5IG9mIGl0ZW0gaXMgbm90IGZpeGVkLCB3ZSBoYXZlIGZ1bGwgc3RvY2sgYXZhaWxhYmxlKQojaW5jbHVkZSA8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCgppbnQgdW5ib3VuZGVkS25hcHNhY2soaW50IFcsIGludCBuLCBpbnQgdmFsW10sIGludCB3dFtdKSAgICAgICAgICAvL3NlZSBzdGVwIDQgaW4gYWJvdmUgY29tbWVudHMKewogICAgLy8gZHBbaV0gaXMgZ29pbmcgdG8gc3RvcmUgbWF4aW11bSB2YWx1ZQogICAgLy8gd2l0aCBrbmFwc2FjayBjYXBhY2l0eSBpLgogICAgaW50IGRwW1crMV07CiAgICBtZW1zZXQoZHAsIDAsIHNpemVvZiBkcCk7CiAKICAgIGludCBhbnMgPSAwOwogCiAgICAvLyBGaWxsIGRwW10gdXNpbmcgYWJvdmUgcmVjdXJzaXZlIGZvcm11bGEKICAgIGZvciAoaW50IGk9MDsgaTw9VzsgaSsrKQogICAgICBmb3IgKGludCBqPTA7IGo8bjsgaisrKQogICAgICAgICBpZiAod3Rbal0gPD0gaSkKICAgICAgICAgICAgZHBbaV0gPSBtYXgoZHBbaV0sIGRwW2ktd3Rbal1dK3ZhbFtqXSk7CiAKICAgIHJldHVybiBkcFtXXTsKfQp2b2lkIHNvcnQoY2hhciAqaXRlbSwgaW50ICp3dCwgaW50ICp2YWwsIGludCBuKXsgICAgLy9zb3J0aW5nIGZ1bmN0aW9uIGZvciBhcnJhbmdpbmcgdmFsdWVzIGluIGRlY3JlYXNpbmcgb3JkZXIuLi4KICAgIGludCBpLGo7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vb2YgdmFsdWUvd2VpZ2h0IC4uLi4uLgogICAgZm9yKGk9MDtpPG47aSsrKXsKICAgICAgICBmb3Ioaj0wO2o8bi1pLTE7aisrKXsKICAgICAgICAgICAgaWYoKGRvdWJsZSl2YWxbal0vd3Rbal08KGRvdWJsZSl2YWxbaisxXS93dFtqKzFdKXsKICAgICAgICAgICAgICAgIGludCB2PXZhbFtqXSx3PXd0W2pdOwogICAgICAgICAgICAgICAgY2hhciBjPWl0ZW1bal07CiAgICAgICAgICAgICAgICB2YWxbal09dmFsW2orMV07IHd0W2pdPXd0W2orMV07aXRlbVtqXT1pdGVtW2orMV07CiAgICAgICAgICAgICAgICB2YWxbaisxXT12LHd0W2orMV09dyxpdGVtW2orMV09YzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQoKaW50IG1haW4oKQp7CiAgICBjaGFyIGl0ZW1bXSA9IHsgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJyB9OyAgIC8vaXRlbXMKICAgIGludCBodWZmbWFuX2xlbltdPXs0LDQsMywzLDMsMX07ICAgICAgICAgICAgICAgIC8vY29ycmVzcG9uZGluZyBiaXQtbGVuZ3RoIGxlbmd0aHMod29ya3MgYXMgd2VpZ2h0cyBmb3IgMDEga25hcHNhY2spCiAgICBpbnQgZmluX3ZhbFtdPXsxNSwyNSwxMiwyNSwxLDE1fTsgICAgICAgICAgICAgICAvL3ZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIGl0ZW1zCiAgICBpbnQgc2l6ZSA9IHNpemVvZihpdGVtKSAvIHNpemVvZihpdGVtWzBdKTsKICAgIGludCBXPTEzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9JdCBpcyBiaXQtbGVuZ3RoIG9mIGludm9pY2UgZmlsZQogICAgCiAgICAKCS8vZm9yKGludCBpPTA7aTw2O2krKykgcHJpbnRmKCJpdGVtPSVjIGxlbj0lZCBmaW5fdmFsPSVkXG4iLGl0ZW1baV0saHVmZm1hbl9sZW5baV0sZmluX3ZhbFtpXSk7CiAgICBzb3J0KGl0ZW0saHVmZm1hbl9sZW4sZmluX3ZhbCxzaXplKTsKICAgIC8vcHJpbnRmKCJcbkFmdGVyIHNvcnRpbmcgaW4gZGVjcmVhc2luZyBvcmRlciBvZiB2YWwvd3RcbiIpOwogICAgLy9mb3IoaW50IGk9MDtpPDY7aSsrKSBwcmludGYoIml0ZW09JWMgbGVuPSVkIGZpbl92YWw9JWRcbiIsaXRlbVtpXSxodWZmbWFuX2xlbltpXSxmaW5fdmFsW2ldKTsKICAgIHByaW50ZigiTWF4aW11bSB2YWx1ZSBvZiBsb290IHBvc3NpYmxlIHdpdGhpbiBnaXZlbiBzdGlwdWxhdGVkIGJpdHM9JWQgIix1bmJvdW5kZWRLbmFwc2FjayhXLHNpemUsZmluX3ZhbCxodWZmbWFuX2xlbikpOyAKICAgIHJldHVybiAwOwp9