From 839f18ec81d82af016e042674aec1ce2912ae84e Mon Sep 17 00:00:00 2001 From: crupest Date: Tue, 23 Feb 2021 21:27:58 +0800 Subject: import(solutions): Add acwing problem 2 (pack problem). --- works/solutions/acwing/2-2.cpp | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 works/solutions/acwing/2-2.cpp (limited to 'works/solutions/acwing/2-2.cpp') diff --git a/works/solutions/acwing/2-2.cpp b/works/solutions/acwing/2-2.cpp new file mode 100644 index 0000000..de812f4 --- /dev/null +++ b/works/solutions/acwing/2-2.cpp @@ -0,0 +1,29 @@ +#include +#include + +int N, V; +int v[1001]; +int w[1001]; +int states[1001]; + +int main() { + std::cin >> N >> V; + + for (int i = 1; i <= N; i++) { + std::cin >> v[i] >> w[i]; + } + + for (int i = 1; i <= N; i++) { + for (int j = V; j >= 0; j--) { + if (j >= v[i]) { + states[j] = std::max(states[j], states[j - v[i]] + w[i]); + } else { + states[j] = states[j]; + } + } + } + + std::cout << states[V]; + + return 0; +} -- cgit v1.2.3 From a14a096c787a71f6e60a108f9640b6127b997404 Mon Sep 17 00:00:00 2001 From: crupest Date: Wed, 24 Feb 2021 15:32:25 +0800 Subject: import(solutions): Add acwing problem 4 (aka multiple pack problem). --- works/solutions/acwing/2-2.cpp | 8 ++----- works/solutions/acwing/3-2.cpp | 8 ++----- works/solutions/acwing/4.cpp | 51 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 55 insertions(+), 12 deletions(-) create mode 100644 works/solutions/acwing/4.cpp (limited to 'works/solutions/acwing/2-2.cpp') diff --git a/works/solutions/acwing/2-2.cpp b/works/solutions/acwing/2-2.cpp index de812f4..fb0fb3b 100644 --- a/works/solutions/acwing/2-2.cpp +++ b/works/solutions/acwing/2-2.cpp @@ -14,12 +14,8 @@ int main() { } for (int i = 1; i <= N; i++) { - for (int j = V; j >= 0; j--) { - if (j >= v[i]) { - states[j] = std::max(states[j], states[j - v[i]] + w[i]); - } else { - states[j] = states[j]; - } + for (int j = V; j >= v[i]; j--) { + states[j] = std::max(states[j], states[j - v[i]] + w[i]); } } diff --git a/works/solutions/acwing/3-2.cpp b/works/solutions/acwing/3-2.cpp index 6565c5b..c099838 100644 --- a/works/solutions/acwing/3-2.cpp +++ b/works/solutions/acwing/3-2.cpp @@ -14,12 +14,8 @@ int main() { } for (int i = 1; i <= N; i++) { - for (int j = 0; j <= V; j++) { - if (j >= v[i]) { - states[j] = std::max(states[j], states[j - v[i]] + w[i]); - } else { - states[j] = states[j]; - } + for (int j = v[i]; j <= V; j++) { + states[j] = std::max(states[j], states[j - v[i]] + w[i]); } } diff --git a/works/solutions/acwing/4.cpp b/works/solutions/acwing/4.cpp new file mode 100644 index 0000000..3270402 --- /dev/null +++ b/works/solutions/acwing/4.cpp @@ -0,0 +1,51 @@ +#include +#include + +int N, V; +int v[101]; +int w[101]; +int s[101]; +int states[101]; + +void CompletePack(int v, int w) { + for (int j = v; j <= V; j++) { + states[j] = std::max(states[j], states[j - v] + w); + } +} + +void ZeroOnePack(int v, int w) { + for (int j = V; j >= v; j--) { + states[j] = std::max(states[j], states[j - v] + w); + } +} + +int main() { + std::cin >> N >> V; + + for (int i = 1; i <= N; i++) { + std::cin >> v[i] >> w[i] >> s[i]; + } + + for (int i = 1; i <= N; i++) { + if (v[i] * s[i] >= V) { + CompletePack(v[i], w[i]); + } else { + int k = 1; + int amount = s[i]; + + while (k < amount) { + ZeroOnePack(k * v[i], k * w[i]); + amount -= k; + k *= 2; + } + + if (amount != 0) { + ZeroOnePack(amount * v[i], amount * w[i]); + } + } + } + + std::cout << states[V]; + + return 0; +} -- cgit v1.2.3