From c6aeaa512a66f635cf73cfe14496e25fcc574ea7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B5=B7?= <10402852@qq.com> Date: Tue, 12 Mar 2024 16:47:09 +0800 Subject: [PATCH] 'commit' --- TangDou/AcWing/BeiBao/1020.md | 30 ++++++------------------------ TangDou/AcWing/BeiBao/1020_1.cpp | 6 +++--- 2 files changed, 9 insertions(+), 27 deletions(-) diff --git a/TangDou/AcWing/BeiBao/1020.md b/TangDou/AcWing/BeiBao/1020.md index 501894d..659f00c 100644 --- a/TangDou/AcWing/BeiBao/1020.md +++ b/TangDou/AcWing/BeiBao/1020.md @@ -87,48 +87,30 @@ $f(i,j,k)$ 表示从前$i$个物品中选,且花费$1$**不少于**$j$,花费$ **答**:不需要,都可以满足要求了,即$j=0,k=0$,也就是$f[i-1][0][0]+w$,而对于一个无欲无求的$f[i-1][0][0]$自然是等于$0$,也就是$f[i][j][k]=w$ -### 三、三维朴素解法 +### 三、三维解法 ```cpp {.line-numbers} #include - using namespace std; const int N = 1010; const int M = 110; +int n, m, m1, m2; int f[N][M][M]; -int n, m1, m2; -//二维费用01背包-不少于维度费用,求最小代价 int main() { - //注意次序 - scanf("%d %d %d", &m1, &m2, &n); - //求最小值 + cin >> m1 >> m2 >> n; memset(f, 0x3f, sizeof f); f[0][0][0] = 0; for (int i = 1; i <= n; i++) { int v1, v2, w; - scanf("%d %d %d", &v1, &v2, &w); + cin >> v1 >> v2 >> w; for (int j = 0; j <= m1; j++) for (int k = 0; k <= m2; k++) { - //不选择i号物品 f[i][j][k] = f[i - 1][j][k]; - //分情况讨论 - - //物品i加上就够一维使用,此时,只关心二维情况即可 - if (j - v1 < 0 && k - v2 >= 0) - f[i][j][k] = min(f[i][j][k], f[i - 1][0][k - v2] + w); - //物品i加上就够二维使用,此时,只关心一维情况即可 - else if (j - v1 >= 0 && k - v2 < 0) - f[i][j][k] = min(f[i][j][k], f[i - 1][j - v1][0] + w); - //如果选择了i号物品,两个维度直接拉满,那么只选择一个i就足够用,它参选的价值是w - else if (j - v1 < 0 && k - v2 < 0) - f[i][j][k] = min(f[i][j][k], w); - else - //正常递推 - f[i][j][k] = min(f[i][j][k], f[i - 1][j - v1][k - v2] + w); + f[i][j][k] = min(f[i - 1][j][k], f[i - 1][max(0, j - v1)][max(0, k - v2)] + w); } } - printf("%d\n", f[n][m1][m2]); + cout << f[n][m1][m2] << endl; return 0; } ``` diff --git a/TangDou/AcWing/BeiBao/1020_1.cpp b/TangDou/AcWing/BeiBao/1020_1.cpp index 10f958c..f207c48 100644 --- a/TangDou/AcWing/BeiBao/1020_1.cpp +++ b/TangDou/AcWing/BeiBao/1020_1.cpp @@ -11,12 +11,12 @@ int main() { f[0][0][0] = 0; for (int i = 1; i <= n; i++) { - int u, v, w; - cin >> u >> v >> w; + int v1, v2, w; + cin >> v1 >> v2 >> w; for (int j = 0; j <= m1; j++) for (int k = 0; k <= m2; k++) { f[i][j][k] = f[i - 1][j][k]; - f[i][j][k] = min(f[i - 1][j][k], f[i - 1][max(0, j - u)][max(0, k - v)] + w); + f[i][j][k] = min(f[i - 1][j][k], f[i - 1][max(0, j - v1)][max(0, k - v2)] + w); } } cout << f[n][m1][m2] << endl;