每次我更改常量时,结果都不同
Every time I change the constant, the result is different
我想用 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) 重叠子问题 以下是递归实现,它仅遵循上述递归结构。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- #定义c-预处理器常量..我做错了什么
- valgrind-hellgrind与泄漏检查的结果不同
- 用C++中的一个变量定义一个常量
- 什么时候在C++中返回常量引用是个好主意
- 代理对象的常量正确性
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- C++ 获取函数在常量引用中按值返回的结果
- C++位移位在相反方向上具有相同的常量,结果不同,代码更改很小
- 为什么我可以改变常量对象中的成员变量,这是返回常量对象函数的结果?
- 常量方法中 decltype 的结果
- 为什么我不能将 op 结果乘以常量特征张量数组
- 使用变量和常量的结果在 c++ 中并不相同
- 每次我更改常量时,结果都不同
- 非常量表达式的左值到右值转换的结果是常数吗?
- 将计算结果保存到常量参考中
- static_casting constexpr void* 的结果是常量表达式吗?
- 为什么不允许我将函数返回 const char* 的结果分配给 char*,bt 可以将字符串文字(常量)分配给 cha
- 为什么带变量的左移和带常量的左移会产生不同的结果?
- C++11 MinGW 4.9.1 shared_ptr和常量静态类字段结果"Undefined reference"