# **Bài 1**: Cái Túi
```cpp
#include <bits/stdc++.h>
using namespace std;
long long n,t,F[105][200005],W[10005],V[10005];
int main() {
cin >> n >> t;
for (int i = 1; i <= n; ++i) cin >> W[i] >> V[i];
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= t; ++j)
if (j >= W[i]) F[i][j] = max(F[i-1][j-W[i]] + V[i],F[i-1][j]);
else F[i][j] = F[i-1][j];
cout << F[n][t];
return 0;
}
```
# **Bài 2**: Dãy Con Có Tổng Bằng S
```cpp
#include <bits/stdc++.h>
using namespace std;
const int MOD = 1e9+7;
long long n,s,A[105];
int F[1005];
int main() {
memset(F,0,sizeof(F));
F[0] = 1;
cin >> n >> s;
for (int i = 1; i <= n; ++i) cin >> A[i];
for (int i = 1; i <= n; ++i)
for (int j = s; j >= A[i]; --j)
F[j] = (F[j] + F[j-A[i]]) % MOD;
cout << F[s];
return 0;
}
```
# **Bài 3**: Chia Kẹo
```cpp
#include <bits/stdc++.h>
using namespace std;
bool F[100005];
int n,s = 0,A[105];
int main() {
memset(F,false,sizeof(F));
F[0] = true;
cin >> n;
for (int i = 1; i <= n; ++i ) {
cin >> A[i];
s += A[i];
}
for (int i = 1; i <= n; ++i)
for (int j = s; j >= A[i]; --j)
if (F[j - A[i]])
F[j] = true;
for (int i = s/2; i >= 1; i--) if (F[i]) {
cout << s - (i*2);
exit(0);
}
return 0;
}
```
# **Bài 4**: Tích Lớn Nhất
```cpp
#include <bits/stdc++.h>
using namespace std;
bool F[100005];
int n,s = 0,A[105];
int main() {
memset(F,false,sizeof(F));
F[0] = true;
cin >> n;
for (int i = 1; i <= n; ++i ) {
cin >> A[i];
s += A[i];
}
for (int i = 1; i <= n; ++i)
for (int j = s; j >= A[i]; --j)
if (F[j - A[i]])
F[j] = true;
for (int i = s/2; i >= 1; i--) if (F[i]) {
cout << i*(s-i);
exit(0);
}
return 0;
}
```