-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy path0-1knapsack dp.cpp
105 lines (81 loc) Β· 2.39 KB
/
0-1knapsack dp.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/*
///////////////////////////////////////////
//Question/Info
recursion is the parent of dp.
dp is enhanced recursion.
we us dp when choice given or its asking optimal...
if two functions are being called in a recursion then its probable that you could use dp.
recusrsive function-> memoization and top-down
knapsack types: fractional(done via greedy) , 0-1 knapsack , unbounded knapsack
fractional... we can divide the weight of items and add in values...
0-1... we either put an item or not,...can't divide like fractional...
unbounded... we can add multiple occurences of an item...
recursive base condition becomes similarly initialization for top down...
When to apply dp... when knapsack like questions given...
like to find max of something from..............
///////////////////////////////////////////
*/
#include <bits/stdc++.h>
using namespace std;
#define int long long int
#define setbits(x) __builtin_popcount(x)
#define pb(x) push_back(x)
#define mp(x,y) make_pair(x,y)
#define ct(x) cout<<x<<endl;
#define ct2(x,y) cout<<x<<" "<<y<<endl;
#define forn(i,n) for(int i = 0; i < (int)(n); i++)
#define forx(i,x,n) for(int i = x; i < (int)(n); i++)
#define all(v) v.begin(),v.end()
#define fsp(x,y) fixed<<setprecision(y)<<x;
#define PI 3.1415926535897932384626433832795
#define MOD 1000000007 // (1e9+7)
#define pii pair<int,int>
#define pis pair<int,string>
#define vi vector<int>
#define vii vector<pii>
#define mii map<int,int>
//typedef long long int lli;
typedef long double ld;
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
void c_p_c()
{
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
}
int32_t main() {
///////////
c_p_c();
///////////
// code
/*
int t ; cin >> t; while(t--){}
*/
// 0- 1 knapsack dp
int knapSack(int W, int wt[], int val[], int n)
{
int i, j;
int K[n + 1][W + 1];
// Build table K[][] in bottom up manner
for (i = 0; i <= n; i++)
{
for (j = 0; j <= W; j++)
{
if (i == 0 || j == 0)
K[i][j] = 0;
else if (wt[i - 1] <= j)
K[i][j] = max(val[i - 1]
+ K[i - 1][j - wt[i - 1]],
K[i - 1][j]);
else
K[i][j] = K[i - 1][j];
}
}
return K[n][W];
}
return 0;
}
// int dp[n + 1][W + 1];