278. 数字组合 - AcWing
| C++ |
|---|
| #include <bits/stdc++.h>
using namespace std;
// 2023 OneWan
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int N, M;
cin >> N >> M;
vector<int> v(N);
for (int i = 0 ; i < N ; i++) {
cin >> v[i];
}
vector<int> dp(M + 1);
dp[0] = 1;
for (int i = 0 ; i < N ; i++) {
for (int j = M ; j >= v[i] ; j--) {
dp[j] = dp[j] + dp[j - v[i]];
}
}
cout << dp[M] << "\n";
return 0;
}
|
11. 背包问题求方案数 - AcWing
| C++ |
|---|
| #include <bits/stdc++.h>
using namespace std;
// 2023 OneWan
const long long mod = 1000000007;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int N, M;
cin >> N >> M;
vector<int> v(N), w(N);
for (int i = 0 ; i < N ; i++) {
cin >> w[i] >> v[i];
}
vector<long long> dp(M + 1), g(M + 1);
g[0] = 1;
for (int i = 0 ; i < N ; i++) {
for (int j = M ; j >= w[i] ; j--) {
long long k;
long long temp = dp[j - w[i]] + v[i];
if (dp[j] < temp) {
g[j] = g[j - w[i]];
dp[j] = temp;
} else if (dp[j] == temp) {
g[j] = (g[j] + g[j - w[i]]) % mod;
}
}
}
long long res = 0;
for (int i = 0 ; i <= M ; i++) {
res = max(res, dp[i]);
}
long long ans = 0;
for (int i = 0 ; i <= M ; i++) {
if (dp[i] == res) {
ans = (ans + g[i]) % mod;
}
}
cout << ans;
return 0;
}
|
12. 背包问题求具体方案 - AcWing
| C++ |
|---|
| #include <bits/stdc++.h>
using namespace std;
// 2023 OneWan
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int N, M;
cin >> N >> M;
vector<int> v(N), w(N);
for (int i = 0 ; i < N ; i++) {
cin >> w[i] >> v[i];
}
vector<vector<long long>> dp(N + 1, vector<long long>(M + 1));
for (int i = N - 1 ; i >= 0 ; i--) {
for (int j = 0 ; j <= M ; j++) {
dp[i][j] = dp[i + 1][j];
}
for (int j = M ; j >= w[i] ; j--) {
dp[i][j] = max(dp[i + 1][j], dp[i + 1][j - w[i]] + v[i]);
}
}
vector<int> ans;
for (int i = 0, j = M ; i < N ; i++) {
if (j >= w[i] && dp[i][j] == dp[i + 1][j - w[i]] + v[i]) {
ans.emplace_back(i + 1);
j -= w[i];
}
}
for (auto &i : ans) {
cout << i << " ";
}
return 0;
}
|
| C++ |
|---|
| #include <bits/stdc++.h>
using namespace std;
// 2023 OneWan
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int N, M;
cin >> N >> M;
vector<int> v(N), w(N);
for (int i = 0 ; i < N ; i++) {
cin >> w[i] >> v[i];
}
vector<vector<long long>> dp(N + 1, vector<long long>(M + 1));
for (int i = 1 ; i <= N ; i++) {
for (int j = 0 ; j <= M ; j++) {
dp[i][j] = dp[i - 1][j];
}
for (int j = M ; j >= w[i - 1] ; j--) {
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - w[i - 1]] + v[i - 1]);
}
}
vector<int> ans;
for (int i = N - 1, j = M ; i >= 0 ; i--) {
if (j >= w[i] && dp[i + 1][j] - v[i] == dp[i][j - w[i]]) {
ans.emplace_back(i + 1);
j -= w[i];
}
}
for (auto &i : ans) {
cout << i << " ";
}
return 0;
}
|