每次我更改常量时,结果都不同

Every time I change the constant, the result is different

本文关键字:结果 常量      更新时间:2023-10-16

我想用 c++ 编写 01 背包问题。每次我将常量 MAX 的值更改为不同的值(例如 100、90 或 80)时,结果都不同。原因是什么?我正在使用Visual Studio 2019。

例如,输入是一个文本文件。

20

40 3518 4 10 2 70 20 39 37 7 5 10 8 15 21 50 40 10 30

100 50 45 20 10 5 31 10 20 19 4 3 6 8 12 7 10 2 5 5

137

第一行是物品的数量,第二行是价格,第三行是重量,最后一行是背包的大小。

#include <stdio.h>
#include <time.h>
#define MAX 100
#define CLOCKS_PER_MS CLOCKS_PER_SEC/1000
int X_d[MAX] = { 0 }; //solution vector
int max(int a, int b) {
if (a >= b)
return a;
else
return b;
}
void dynamic(int n, int M, int p[], int w[]) {
int result;
int i, y, k;
int P[MAX][MAX] = { 0 };
clock_t start, finish;
start = clock();
for (i = 0; i <= n; i++) {
for (y = 0; y <= M; y++) {
if (i == 0 || y == 0)
P[i][y] = 0;
else if (w[i - 1] > y)
P[i][y] = P[i - 1][y];
else
P[i][y] = max(P[i - 1][y], p[i - 1] + P[i - 1][y - w[i - 1]]);
}
}
finish = clock();
result = P[n][M];
y = M;
for (i = n; i > 0 && result > 0; i--) {
if (result == P[i - 1][y]) {
continue;
}
else {
X_d[i - 1] = 1;
result = result - p[i - 1];
y = y - w[i - 1];
}
}
printf("n(1) Dynamic Programming");
printf("nThe maximum profit is $%d", P[n][M]);
printf("nThe solution vetor X = ( ");
for (k = 0; k < n; k++)
printf("%d ", X_d[k]);
printf(")n");
printf("The execution time is %f milliseconds.n", (float)(finish - start) / CLOCKS_PER_MS);
}
int main() {
int i, j;
int num, M;
int p[MAX] = { 0 }, w[MAX] = { 0 };
FILE* fp = NULL;

fopen_s(&fp, "p2data6.txt", "r");
fscanf_s(fp, "%d", &num);
for (i = 0; i < num; i++)
fscanf_s(fp, "%d", &p[i]);
for (i = 0; i < num; i++)
fscanf_s(fp, "%d", &w[i]);
fscanf_s(fp, "%d", &M);
printf("n = %dn", num);
printf("pi = ");
for (i = 0; i < num; i++)
printf("%3d ", p[i]);
printf("nwi = ");
for (i = 0; i < num; i++)
printf("%3d ", w[i]);
printf("npi/wi = ");
for (i = 0; i < num; i++)
printf("%f ", (double)p[i] / w[i]);
printf("nM = %dn", M);
dynamic(num, M, p, w);
return 0;
}

Geeks for Geeks 在这里对这个问题有一个很好的解释:

引用Sam007的Geeks for Geeks文章:

一个简单的解决方案是考虑项目的所有子集,并计算所有子集的总重量和值。考虑总权重小于 W 的唯一子集。从所有此类子集中,选择最大值子集。

1)最佳下部结构: 要考虑项目的所有子集,每个项目可能有两种情况:(1) 项目包含在最优子集中,(2) 不包括在最优集中。 因此,可以从 n 个项目中获得的最大值是以下两个值的最大值。 1) n-1项和W项(不包括第n项)获得的最大值。 2) 第 n 项的值加上 n-1 项获得的最大值,W 减去第 n 项(包括第 n 项)的重量。

如果第 n 项的权重大于 W,则不能包含第 n 项,并且情况 1>是唯一的可能性。

2) 重叠子问题 以下是递归实现,它仅遵循上述递归结构。