Skip to content

Commit b30d7d7

Browse files
Added Knapsack, CoinChange and Maximum path sum problems
1 parent 487059b commit b30d7d7

File tree

3 files changed

+139
-0
lines changed

3 files changed

+139
-0
lines changed

Dynamic Programming/CoinChange.cpp

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
#include <bits/stdc++.h>
2+
3+
using namespace std;
4+
const int N = (1<<20) , M = (1<<16), OO = 0x3f3f3f3f;
5+
6+
int Coins[] = {5, 10, 25, 50, 100};
7+
long long mem[N];
8+
int n;
9+
10+
/*
11+
long long solve(int i = 0, int rem = n){ //O(n*5)
12+
if(i==5) return rem==0;
13+
return solve(i+1, rem) + (rem>=Coins[i]? solve(i, rem-Coins[i]) : 0);
14+
}
15+
*/
16+
17+
long long coinChange(int rem = n){ //O(n*5)
18+
if(!rem) return 1;
19+
long long & ret = mem[rem];
20+
if(~ret) return ret;
21+
ret = 0;
22+
for(int i = 0 ; i < 5 ; ++i)
23+
ret += (rem>=Coins[i]? coinChange(rem-Coins[i]) : 0);
24+
return ret;
25+
}
26+
27+
int main(){
28+
// freopen("i.in", "rt", stdin);
29+
// freopen("o.out", "wt", stdout);
30+
memset(mem, -1, sizeof mem);
31+
scanf("%d", &n);
32+
printf("%lld\n", coinChange());
33+
return 0;
34+
}
35+
36+
37+
38+
39+
40+
41+
42+
43+
44+
45+
46+
47+
48+
49+
50+
51+
52+

Dynamic Programming/Knapsack.cpp

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
#include <bits/stdc++.h>
2+
3+
using namespace std;
4+
const int N = (1<<10) , M = (1<<16), OO = 0x3f3f3f3f;
5+
6+
int n, W[N], C[N], k;
7+
int mem[N][N]; //O(n*k)
8+
9+
int KS(int i = 0, int rem = k){ //O(n*k)
10+
if(i == n) return 0;
11+
int & ret = mem[i][rem];
12+
if(~ret) return ret;
13+
return ret = max(rem>=W[i]? KS(i+1, rem-W[i])+C[i] : -OO, KS(i+1, rem));
14+
}
15+
16+
int main(){
17+
// freopen("i.in", "rt", stdin);
18+
// freopen("o.out", "wt", stdout);
19+
scanf("%d %d", &n, &k);
20+
memset(mem, -1, sizeof mem);
21+
for(int i = 0 ; i < n ; ++i)
22+
scanf("%d %d", W+i, C+i);
23+
printf("%d\n", KS());
24+
return 0;
25+
}
26+
27+
28+
29+
30+
31+
32+
33+
34+
35+
36+
37+
38+
39+
40+
41+
42+
43+
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
#include <bits/stdc++.h>
2+
3+
using namespace std;
4+
const int N = (1<<10) , M = (1<<16), OO = 0x3f3f3f3f;
5+
6+
int n, m, A[N][N];
7+
int mem[N][N];
8+
9+
int maximumPathSum(int i=0, int j=0){
10+
if(i==n-1 && j==m-1) return 0;
11+
int & ret = mem[i][j];
12+
if(ret != OO) return ret;
13+
return ret=max(i+1<n? maximumPathSum(i+1, j) : -OO, j+1<m? maximumPathSum(i, j+1) : -OO) + A[i][j];
14+
}
15+
16+
int main(){
17+
// freopen("i.in", "rt", stdin);
18+
// freopen("o.out", "wt", stdout);
19+
scanf("%d %d", &n, &m);
20+
memset(mem, OO, sizeof mem);
21+
for(int i = 0 ; i < n ; ++i)
22+
for(int j = 0 ; j < m ; ++j)
23+
scanf("%d", A[i]+j);
24+
printf("%d\n", maximumPathSum());
25+
return 0;
26+
}
27+
28+
29+
30+
31+
32+
33+
34+
35+
36+
37+
38+
39+
40+
41+
42+
43+
44+

0 commit comments

Comments
 (0)