add
This commit is contained in:
@@ -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.
@@ -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;
|
||||
}
|
||||
@@ -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.
@@ -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.
@@ -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.
Reference in New Issue
Block a user