This commit is contained in:
2026-06-15 09:00:38 +08:00
parent fec66377d5
commit 4640c5e02b
191 changed files with 6046 additions and 0 deletions
+58
View File
@@ -0,0 +1,58 @@
#include <stdio.h>
#define ITEM_COUNT 5
#define CAPACITY 6
int weights[ITEM_COUNT] = { 2, 3, 6, 5, 4 };
int values[ITEM_COUNT] = { 60, 30, 50, 40, 60 };
// 递推实现
void bag01Ditui() {
int f[CAPACITY + 1] = {0}; // 初始化数组
int taken[ITEM_COUNT][CAPACITY + 1] = {0}; // 用于记录物品放置状态
for (int i = 0; i < ITEM_COUNT; i++) {
int w = weights[i];
int v = values[i];
for (int j = CAPACITY; j >= w; j--) {
if (f[j] < f[j - w] + v) { // 如果放入当前物品后价值更高
f[j] = f[j - w] + v;
taken[i][j] = 1; // 标记当前物品被放入
}
}
}
printf("最大价值为: %d\n", f[CAPACITY]);
// 打印各物品的放置情况
printf("放入背包的物品: ");
for (int i = ITEM_COUNT - 1, j = CAPACITY; i >= 0; i--) {
if (taken[i][j]) {
printf("%d ", i + 1); // 输出物品编号 (1-based index)
j -= weights[i]; // 减去相应的重量
}
}
printf("\n");
}
// 递归实现
int bagProblem(int i, int j) {
if (i < 0) {
return 0;
}
int r = 0;
// 如果剩余空间大于或等于当前物品的重量
if (j >= weights[i]) {
// 放入当前物品的价值
int r1 = bagProblem(i - 1, j - weights[i]) + values[i];
// 不放入当前物品的价值
int r2 = bagProblem(i - 1, j);
r = (r1 > r2) ? r1 : r2;
} else {
r = bagProblem(i - 1, j);
}
return r;
}
int main() {
bag01Ditui();
printf("递归方式得到的最大价值为: %d\n", bagProblem(ITEM_COUNT - 1, CAPACITY));
return 0;
}
Binary file not shown.
+84
View File
@@ -0,0 +1,84 @@
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAX_N 100
#define MAX_C 100
// 定义结构体以存储背包问题的相关数据
typedef struct {
int N; // 物体的个数
int C; // 背包的容量
int weight[MAX_N]; // 每个物体的重量
int value[MAX_N]; // 每个物体的价值
int DP[MAX_N][MAX_C]; // 动态规划表
} Bag;
void bag01NoRec(Bag* bag) {
// 初始化 DP 表
for (int j = 0; j <= bag->C; j++) {
bag->DP[0][j] = 0;
}
// 填充 DP 表
for (int i = 1; i <= bag->N; i++) {
for (int j = 0; j <= bag->C; j++) {
if (j >= bag->weight[i]) { // 如果容量为 j 的背包能够放下第 i 个物体
bag->DP[i][j] = (bag->DP[i - 1][j - bag->weight[i]] + bag->value[i] > bag->DP[i - 1][j]) ?
(bag->DP[i - 1][j - bag->weight[i]] + bag->value[i]) : bag->DP[i - 1][j];
} else {
// 物体放不下,仅选择不放该物体
bag->DP[i][j] = bag->DP[i - 1][j];
}
}
}
// 打印 DP 表
for (int i = 0; i <= bag->N; i++) {
for (int j = 0; j <= bag->C; j++) {
printf("%d ", bag->DP[i][j]);
}
printf("\n");
}
}
void printResult(Bag* bag, int n, int v) {
bool isAdd[MAX_N] = {false};
for (int i = n; i >= 1; i--) {
if (bag->DP[i][v] == bag->DP[i - 1][v])
isAdd[i] = false;
else {
isAdd[i] = true;
v -= bag->weight[i];
}
}
for (int i = 1; i <= n; i++) {
printf("%d号 %s; ", i, isAdd[i] ? "" : "不放");
}
printf("\n");
}
// 使用 init2 函数初始化,并测试背包算法
void init2(Bag* bag) {
bag->C = 6;
bag->weight[1] = 3;
bag->weight[2] = 2;
bag->weight[3] = 6;
bag->weight[4] = 5;
bag->weight[5] = 4;
bag->value[1] = 30;
bag->value[2] = 60;
bag->value[3] = 50;
bag->value[4] = 40;
bag->value[5] = 60;
bag->N = 5;
bag01NoRec(bag);
printResult(bag, bag->N, bag->C);
}
int main() {
Bag bag;
init2(&bag);
return 0;
}
+40
View File
@@ -0,0 +1,40 @@
#include <stdio.h>
#define ITEM_COUNT 5
#define CAPACITY 6
int weights[ITEM_COUNT + 1] = {0, 2, 3, 6, 5, 4}; // 物品重量,从1开始以匹配索引
int values[ITEM_COUNT + 1] = {0, 60, 30, 50, 40, 60}; // 物品价值,从1开始以匹配索引
int DP[ITEM_COUNT + 1][CAPACITY + 1] = {0}; // 动态规划数组
void bag01Ditui() {
for (int i = 1; i <= ITEM_COUNT; i++) {
for (int j = 0; j <= CAPACITY; j++) {
if (j >= weights[i]) {
DP[i][j] = (DP[i - 1][j] > DP[i - 1][j - weights[i]] + values[i])
? DP[i - 1][j]
: DP[i - 1][j - weights[i]] + values[i];
} else {
DP[i][j] = DP[i - 1][j];
}
}
}
}
void printResult(int n, int v) {
int isAdd[ITEM_COUNT + 1] = {0}; // 记录物品放置情况
for (int i = n; i >= 1; i--) {
if (DP[i][v] == DP[i - 1][v])
isAdd[i] = 0; // 不放此物品
else {
isAdd[i] = 1; // 放此物品
v -= weights[i]; // 减去相应的重量
}
}
for (int i = 1; i <= n; i++) {
printf(" %d号%s; ", i, isAdd[i] ? "" : "不放");
}
printf("\n");
}
int main() {
bag01Ditui(); // 计算动态规划数组
printf("最大价值为: %d\n", DP[ITEM_COUNT][CAPACITY]);
printResult(ITEM_COUNT, CAPACITY); // 打印物品放置情况
return 0;
}
Binary file not shown.
+43
View File
@@ -0,0 +1,43 @@
#include <stdio.h>
#include <stdlib.h>
void CreatYH(int n) {
// 创建一个n行n列的二维数组
int **arr = (int **)malloc(n * sizeof(int *));
for (int i = 0; i < n; i++) {
arr[i] = (int *)malloc(n * sizeof(int));
}
// 初始化数组元素值
for (int i = 0; i < n; i++) {
arr[i][0] = 1; // 第一列值
arr[i][i] = 1; // 斜边值
}
// 使用杨辉三角的填充规则
for (int i = 3; i <= n; i++) {
for (int j = 2; j < i; j++) {
arr[i - 1][j - 1] = arr[i - 2][j - 1] + arr[i - 2][j - 2]; // 赋值
}
// C语言不需要裁剪数组,因为定义了最大大小
}
// 输出数组
for (int i = 0; i < n; i++) {
for (int j = 0; j <= i; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
// 释放内存
for (int i = 0; i < n; i++) {
free(arr[i]); // 释放每一行
}
free(arr); // 释放数组指针
}
int main() {
CreatYH(5);
return 0;
}
Binary file not shown.
+27
View File
@@ -0,0 +1,27 @@
#include <stdio.h>
#define MAX_SIZE 10 // 定义最大大小,可以根据需要调整
void creatYH(int n) {
int arr[MAX_SIZE][MAX_SIZE] = {0}; // 初始化为 0
// 初始化数组元素值
for (int i = 0; i < n; i++) {
arr[i][0] = 1; // 第一列值
arr[i][i] = 1; // 斜边值
}
// 使用杨辉三角的填充规则
for (int i = 2; i < n; i++) { // 从第三行开始填充
for (int j = 1; j < i; j++) {
arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j]; // 赋值
}
}
// 输出数组
for (int i = 0; i < n; i++) {
for (int j = 0; j <= i; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
int main() {
creatYH(5); // 调用函数打印杨辉三角的前5行
return 0;
}
Binary file not shown.