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.
@@ -0,0 +1,48 @@
|
||||
#include <stdio.h>
|
||||
#include <limits.h> // 用于 INT_MAX
|
||||
|
||||
#define MAX_AMOUNT 100 // 定义最大金额
|
||||
|
||||
// 函数原型
|
||||
int coinChange(int coins[], int numCoins, int amount);
|
||||
|
||||
int main() {
|
||||
int coins[] = {1, 2, 5}; // 硬币面额数组
|
||||
int amount = 29; // 目标金额
|
||||
int numCoins = sizeof(coins) / sizeof(coins[0]); // 硬币数量
|
||||
|
||||
int result = coinChange(coins, numCoins, amount);
|
||||
if (result != -1) {
|
||||
printf("组成金额 %d 所需的最少硬币数为: %d\n", amount, result);
|
||||
} else {
|
||||
printf("无法组成金额 %d。\n", amount);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int coinChange(int coins[], int numCoins, int amount) {
|
||||
// 创建一个固定大小的数组来存储最少硬币数
|
||||
int dp[MAX_AMOUNT + 1];
|
||||
|
||||
// 初始化 dp 数组
|
||||
for (int i = 0; i <= MAX_AMOUNT; i++) {
|
||||
dp[i] = INT_MAX; // 将每个值初始化为无穷大
|
||||
}
|
||||
dp[0] = 0; // 组成金额 0 所需的硬币数为 0
|
||||
|
||||
// 填充 dp 数组
|
||||
for (int i = 1; i <= MAX_AMOUNT; i++) {
|
||||
for (int j = 0; j < numCoins; j++) {
|
||||
if (coins[j] <= i) {
|
||||
// 更新 dp[i] 的值
|
||||
if (dp[i - coins[j]] != INT_MAX) {
|
||||
dp[i] = (dp[i] < dp[i - coins[j]] + 1) ? dp[i] : (dp[i - coins[j]] + 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 返回结果
|
||||
return (amount <= MAX_AMOUNT && dp[amount] != INT_MAX) ? dp[amount] : -1;
|
||||
}
|
||||
Binary file not shown.
@@ -0,0 +1,30 @@
|
||||
#include <stdio.h>
|
||||
#include <math.h>
|
||||
int binaryLength1(int i) {
|
||||
if (i == 0) return 1;
|
||||
int k = 1;
|
||||
i = i / 2;
|
||||
while (i > 0) {
|
||||
k++;
|
||||
i = i / 2;
|
||||
}
|
||||
return k;
|
||||
}
|
||||
int binaryLength2(int n) {
|
||||
if (n == 0) return 1;
|
||||
return (int)(log2(n)) + 1;
|
||||
}
|
||||
int binaryLength3(int n) {
|
||||
if (n == 0) return 1;
|
||||
int length = 0;
|
||||
while (n > 0) {
|
||||
n >>= 1; // 右移一位,相当于除以2
|
||||
length++;
|
||||
}
|
||||
return length;
|
||||
}
|
||||
int main(){
|
||||
printf("%d\n",binaryLength1(8));
|
||||
printf("%d\n",binaryLength2(8));
|
||||
printf("%d\n",binaryLength3(8));
|
||||
}
|
||||
Binary file not shown.
@@ -0,0 +1,95 @@
|
||||
#include <stdio.h>
|
||||
#include <math.h>
|
||||
|
||||
#define N 9 // 定义数组大小为9
|
||||
|
||||
// 计算一个整数在二进制中需要的位数
|
||||
int length(int i) {
|
||||
int k = 1; // 初始化位数计数器
|
||||
i = i / 2; // 将整数除以2,开始计算
|
||||
while (i > 0) { // 当i大于0时继续
|
||||
k++; // 每次循环位数增加1
|
||||
i = i / 2; // 继续除以2
|
||||
}
|
||||
return k; // 返回计算得到的位数
|
||||
}
|
||||
|
||||
void Compress(int n, int p[], int s[], int l[], int b[]) {
|
||||
int Lmax = 256, header = 11; // 定义最大段数和头部长度
|
||||
s[0] = 0; // 初始化s数组
|
||||
for (int i = 0; i <= n; i++) { // 遍历每个元素
|
||||
b[i] = length(p[i]); // 计算当前元素的位数
|
||||
int bmax = b[i]; // 记录当前最大位数
|
||||
s[i] = (i > 0 ? s[i - 1] : 0) + bmax + header; //当前段的最小存储长度
|
||||
l[i] = 1; // 初始段数为1
|
||||
for (int j = 2; j <= i + 1 && j <= Lmax; j++) { // 遍历可能的段数
|
||||
if (bmax < length(p[i - j + 1])) { // 更新最大位数
|
||||
bmax = length(p[i - j + 1]);
|
||||
}
|
||||
// 判断是否需要更新存储长度
|
||||
if (s[i] > s[i - j] + j * bmax + header) {
|
||||
s[i] = s[i - j] + j * bmax + header; // 更新最小存储长度
|
||||
l[i] = j; // 更新段数
|
||||
b[i] = bmax; // 更新位数
|
||||
}
|
||||
}
|
||||
printf("组 %d: L = %d, B = %d, S = %d\n", i, l[i], b[i], s[i]);
|
||||
}
|
||||
}
|
||||
|
||||
// 追溯函数,恢复最优分段信息
|
||||
int TraceBack(int n, int l[], int b[]) {
|
||||
int i = 0;
|
||||
int temp_l[N], temp_b[N]; // 临时数组存储分段信息
|
||||
|
||||
// 从最后一个元素向前追溯
|
||||
while (n >= 0) {
|
||||
temp_l[i] = l[n]; // 记录段数
|
||||
temp_b[i] = b[n]; // 记录位数
|
||||
n = n - l[n]; // 更新n,向前移动
|
||||
i++; // 增加索引
|
||||
}
|
||||
|
||||
// 反转数组,恢复正确顺序
|
||||
for (int j = 0; j < i; j++) {
|
||||
b[j] = temp_b[i - j - 1]; // 反向赋值位数
|
||||
l[j] = temp_l[i - j - 1]; // 反向赋值段数
|
||||
}
|
||||
return i; // 返回段数
|
||||
}
|
||||
|
||||
// 输出函数,展示最终结果
|
||||
void Out(int m, int min_len, int l[], int b[], int p[]) {
|
||||
printf("最小长度:%d\n", min_len); // 输出最小存储长度
|
||||
printf("共分成:%d段\n", m); // 输出段数
|
||||
int index = 0; // 初始化索引
|
||||
for (int i = 0; i < m; i++) {
|
||||
// 输出每段的信息
|
||||
printf("第%d段含有%d元素. 需要存储位数%d,", i + 1, l[i], b[i]);
|
||||
printf("元素值:");
|
||||
// 输出当前段的元素值
|
||||
for (int j = 0; j < l[i]; j++) {
|
||||
printf("%d ", p[index++]); // 逐个输出元素
|
||||
}
|
||||
printf("\n"); // 换行
|
||||
}
|
||||
}
|
||||
|
||||
// 主函数,程序入口
|
||||
int main() {
|
||||
int p[] = {4, 6,5, 7, 129, 138, 1,2,3}; // 输入的灰度序列
|
||||
int s[N] = {0}, l[N] = {0}, b[N] = {0}; // 初始化存储长度、段数和位数的数组
|
||||
|
||||
// 输出输入序列
|
||||
printf("图像的灰度序列为:\n");
|
||||
for (int i = 0; i < N; i++) {
|
||||
printf("%d ", p[i]);
|
||||
}
|
||||
printf("\n");
|
||||
|
||||
// 调用压缩函数
|
||||
Compress(N - 1, p, s, l, b);
|
||||
int m = TraceBack(N - 1, l, b); // 调用追溯函数获取段数
|
||||
Out(m, s[N - 1], l, b, p); // 输出结果
|
||||
return 0;
|
||||
}
|
||||
Binary file not shown.
@@ -0,0 +1,107 @@
|
||||
#include <stdio.h>
|
||||
#include <math.h>
|
||||
|
||||
#define N 10 // 定义数组大小为10,包括占位符0
|
||||
|
||||
// 计算一个整数在二进制中需要的位数
|
||||
int length(int i) {
|
||||
int k = 1; // 初始化位数计数器
|
||||
i = i / 2; // 将整数除以2,开始计算
|
||||
while (i > 0) { // 当i大于0时继续
|
||||
k++; // 每次循环位数增加1
|
||||
i = i / 2; // 继续除以2
|
||||
}
|
||||
return k; // 返回计算得到的位数
|
||||
}
|
||||
|
||||
// 压缩函数,计算最优分段
|
||||
void Compress(int n, int p[], int s[], int l[], int b[]) {
|
||||
int Lmax = 256, header = 11; // 定义最大段数和头部长度
|
||||
s[0] = 0; // 初始化s数组
|
||||
|
||||
// 遍历实际数据,不包括第一个元素
|
||||
for (int i = 1; i <= n; i++) {
|
||||
b[i] = length(p[i]); // 计算当前元素的位数
|
||||
int bmax = b[i]; // 记录当前最大位数
|
||||
s[i] = (i > 1 ? s[i - 1] : 0) + bmax + header; // 计算当前段的最小存储长度
|
||||
l[i] = 1; // 初始段数为1
|
||||
printf("mid==%d\n",s[i]);
|
||||
// 遍历可能的段数
|
||||
for (int j = 2; j <= i && j <= Lmax; j++) {
|
||||
// 更新最大位数
|
||||
printf("bmax前**=%d",bmax);
|
||||
if (bmax < length(p[i - j + 1])) {
|
||||
bmax = length(p[i - j + 1]);
|
||||
printf("bmax后**=%d",bmax);
|
||||
}
|
||||
// 判断是否需要更新存储长度
|
||||
printf("\nmid=%d\n",s[i - j] + j * bmax + header);
|
||||
if (s[i] > s[i - j] + j * bmax + header) {
|
||||
|
||||
s[i] = s[i - j] + j * bmax + header; // 更新最小存储长度
|
||||
l[i] = j; // 更新段数
|
||||
b[i] = bmax; // 更新位数
|
||||
// printf("s[i]=%d,mid=%d\n",s[i],s[i - j] + j * bmax + header);
|
||||
}
|
||||
}
|
||||
// 输出当前组的信息
|
||||
printf("组 %d: L = %d, B = %d, S = %d\n", i, l[i], b[i], s[i]);
|
||||
}
|
||||
}
|
||||
|
||||
// 追溯函数,恢复最优分段信息
|
||||
int TraceBack(int n, int l[], int b[]) {
|
||||
int i = 0;
|
||||
int temp_l[N], temp_b[N]; // 临时数组存储分段信息
|
||||
|
||||
// 从最后一个元素向前追溯
|
||||
while (n >= 1) { // 只从1开始追溯,跳过0
|
||||
temp_l[i] = l[n]; // 记录段数
|
||||
temp_b[i] = b[n]; // 记录位数
|
||||
n = n - l[n]; // 更新n,向前移动
|
||||
i++; // 增加索引
|
||||
}
|
||||
|
||||
// 反转数组,恢复正确顺序
|
||||
for (int j = 0; j < i; j++) {
|
||||
b[j] = temp_b[i - j - 1]; // 反向赋值位数
|
||||
l[j] = temp_l[i - j - 1]; // 反向赋值段数
|
||||
}
|
||||
return i; // 返回段数
|
||||
}
|
||||
|
||||
// 输出函数,展示最终结果
|
||||
void Out(int m, int min_len, int l[], int b[], int p[]) {
|
||||
printf("最小长度:%d\n", min_len); // 输出最小存储长度
|
||||
printf("共分成:%d段\n", m); // 输出段数
|
||||
int index = 1; // 从1开始,跳过0
|
||||
for (int i = 0; i < m; i++) {
|
||||
// 输出每段的信息
|
||||
printf("第%d段含有%d元素. 需要存储位数%d,", i + 1, l[i], b[i]);
|
||||
printf("元素值:");
|
||||
// 输出当前段的元素值
|
||||
for (int j = 0; j < l[i]; j++) {
|
||||
printf("%d ", p[index++]); // 逐个输出元素,跳过第一个0
|
||||
}
|
||||
printf("\n"); // 换行
|
||||
}
|
||||
}
|
||||
|
||||
// 主函数,程序入口
|
||||
int main() {
|
||||
int p[] = {0, 4, 6, 5, 7, 129, 138, 1, 2, 3}; // 输入的灰度序列(加了0)
|
||||
int s[N] = {0}, l[N] = {0}, b[N] = {0}; // 初始化存储长度、段数和位数的数组
|
||||
|
||||
// 输出输入序列
|
||||
printf("图像的灰度序列为:\n");
|
||||
for (int i = 0; i < N; i++) {
|
||||
printf("%d ", p[i]);
|
||||
}
|
||||
printf("\n");
|
||||
|
||||
// 调用压缩函数
|
||||
Compress(N - 1, p, s, l, b);
|
||||
int m = TraceBack(N - 1, l, b); // 调用追溯函数获取段数
|
||||
Out(m, s[N - 1], l, b, p); // 输出结果
|
||||
return 0;
|
||||
}
|
||||
Binary file not shown.
@@ -0,0 +1,88 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#define MAX 100
|
||||
int getLCS(char* text1, char* text2) {
|
||||
int t1_len = strlen(text1);
|
||||
int t2_len = strlen(text2);
|
||||
int dp[MAX][MAX] = {0};
|
||||
for (int i = 1; i <= t1_len; i++) {
|
||||
for (int j = 1; j <= t2_len; j++) {
|
||||
if (text1[i - 1] == text2[j - 1]) {
|
||||
//找到一个 lcs 的元素,继续往前找
|
||||
dp[i][j] = 1 + dp[i - 1][j - 1];
|
||||
} else {//谁能让 lcs 最长,就取谁的值
|
||||
dp[i][j] = (dp[i - 1][j] > dp[i][j - 1])?
|
||||
dp[i - 1][j] : dp[i][j - 1];
|
||||
}
|
||||
}
|
||||
}
|
||||
return dp[t1_len][t2_len];
|
||||
}
|
||||
|
||||
void getLCSTable(int dp[MAX][MAX], char* text1, char* text2, char b[MAX][MAX]) {
|
||||
int t1_len = strlen(text1);
|
||||
int t2_len = strlen(text2);
|
||||
for (int i = 1; i <= t1_len; i++) {
|
||||
for (int j = 1; j <= t2_len; j++) {
|
||||
if (text1[i - 1] == text2[j - 1]) {
|
||||
dp[i][j] = 1 + dp[i - 1][j - 1];
|
||||
b[i][j] = 'X'; // LCS元素,使用 'X' 作为占位符
|
||||
} else if (dp[i - 1][j] >= dp[i][j - 1]) {
|
||||
dp[i][j] = dp[i - 1][j];
|
||||
b[i][j] = '|'; // 取上面的值
|
||||
} else {
|
||||
dp[i][j] = dp[i][j - 1];
|
||||
b[i][j] = '-'; // 取左边的值
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void printLCSTable(char b[MAX][MAX], char* t1, char* t2, int l1, int l2) {
|
||||
printf("\t");
|
||||
for (int j = 0; j < l2; j++)
|
||||
printf("%c\t", t2[j]);
|
||||
printf("\n");
|
||||
for (int i = 0; i <= l1; i++) {
|
||||
printf("%c\t", (i == 0) ? ' ' : t1[i - 1]);
|
||||
for (int j = 0; j <= l2; j++) {
|
||||
if (i == 0 && j == 0) {
|
||||
printf("\t");
|
||||
} else {
|
||||
printf("%c\t", b[i][j]);
|
||||
}
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
}
|
||||
|
||||
void printLCSString(char b[MAX][MAX], char* x, int i, int j) {
|
||||
if (i == 0 || j == 0) return;
|
||||
if (b[i][j] == 'X') {
|
||||
printLCSString(b, x, i - 1, j - 1);
|
||||
// 打印当前字符
|
||||
printf("%c", x[i - 1]);
|
||||
} else if (b[i][j] == '|') {
|
||||
printLCSString(b, x, i - 1, j);
|
||||
} else {
|
||||
printLCSString(b, x, i, j - 1);
|
||||
}
|
||||
}
|
||||
|
||||
int main() {
|
||||
char t1[] = "ABCB";
|
||||
char t2[] = "BDCA";
|
||||
printf("字符串: %s 和字符串: %s 的 LCS 长度为: %d\n", t1, t2, getLCS(t1, t2));
|
||||
printf("--------------------------------\n");
|
||||
int dp[MAX][MAX] = {0};
|
||||
char b[MAX][MAX] = {0};
|
||||
getLCSTable(dp, t1, t2, b);
|
||||
printLCSTable(b, t1, t2, strlen(t1), strlen(t2));
|
||||
printf("-------------------------------\n");
|
||||
|
||||
printf("LCS 字符串为: ");
|
||||
printLCSString(b, t1, strlen(t1), strlen(t2));
|
||||
printf("\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
Binary file not shown.
@@ -0,0 +1,96 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
// 打印LCS的函数
|
||||
void PrintLCS(int path[][100], char *x, int i, int j) {
|
||||
if (i == 0 || j == 0) {
|
||||
return;
|
||||
}
|
||||
if (path[i][j] == 0) {
|
||||
PrintLCS(path, x, i - 1, j - 1);
|
||||
printf("%c", x[i - 1]);
|
||||
} else if (path[i][j] == 1) {
|
||||
PrintLCS(path, x, i - 1, j);
|
||||
} else {
|
||||
PrintLCS(path, x, i, j - 1);
|
||||
}
|
||||
}
|
||||
|
||||
// 找到LCS的长度
|
||||
int findLCS(int dp[][100], char *A, int n, char *B, int m) {
|
||||
// 初始化dp数组
|
||||
for (int i = 0; i <= n; i++) {
|
||||
for (int j = 0; j <= m; j++) {
|
||||
dp[i][j] = 0; // 数组初始化
|
||||
}
|
||||
}
|
||||
for (int i = 1; i <= n; i++) {
|
||||
for (int j = 1; j <= m; j++) { // 执行状态转移方程
|
||||
if (A[i - 1] == B[j - 1]) {
|
||||
dp[i][j] = dp[i - 1][j - 1] + 1;
|
||||
} else {
|
||||
dp[i][j] = dp[i - 1][j] > dp[i][j - 1] ? dp[i - 1][j] : dp[i][j - 1];
|
||||
}
|
||||
}
|
||||
}
|
||||
return dp[n][m];
|
||||
}
|
||||
|
||||
int main() {
|
||||
char x[] = "w8xta2px0i1jf4jfn8du8dk1fk2kvchd32";
|
||||
char y[] = "i3xsmdxwuv6a2yt520";
|
||||
|
||||
int m = strlen(x);
|
||||
int n = strlen(y);
|
||||
|
||||
// 创建二维数组
|
||||
int c[101][101]; // 101用于存储m+1和n+1的值
|
||||
int path[101][101]; // 路径数组
|
||||
|
||||
// 初始化二维数组
|
||||
for (int i = 0; i <= m; i++) {
|
||||
c[i][0] = 0;
|
||||
}
|
||||
for (int i = 0; i <= n; i++) {
|
||||
c[0][i] = 0;
|
||||
}
|
||||
|
||||
// 实现LCS逻辑
|
||||
for (int i = 1; i <= m; i++) {
|
||||
for (int j = 1; j <= n; j++) {
|
||||
if (x[i - 1] == y[j - 1]) {
|
||||
c[i][j] = c[i - 1][j - 1] + 1;
|
||||
} else if (c[i - 1][j] >= c[i][j - 1]) {
|
||||
c[i][j] = c[i - 1][j];
|
||||
path[i][j] = 1; // 来自上方
|
||||
} else {
|
||||
c[i][j] = c[i][j - 1];
|
||||
path[i][j] = -1; // 来自左侧
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 输出c数组
|
||||
printf("c:\n");
|
||||
for (int i = 0; i <= m; i++) {
|
||||
for (int j = 0; j <= n; j++) {
|
||||
printf("%d\t", c[i][j]);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
// 输出path数组
|
||||
printf("path:\n");
|
||||
for (int i = 0; i <= m; i++) {
|
||||
for (int j = 0; j <= n; j++) {
|
||||
printf("%d\t", path[i][j]);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
printf("%s与%s的最长公共子序列为:\n", x, y);
|
||||
PrintLCS(path, x, m, n);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#define MAX_LENGTH 30 // 定义一个最大长度常量
|
||||
int main() {
|
||||
char s1[] = "abcdefg"; char s2[] = "cdefgh";
|
||||
// 获取字符串的长度
|
||||
int len1 = strlen(s1); int len2 = strlen(s2);
|
||||
// 使用固定大小的数组
|
||||
char s1_with_space[MAX_LENGTH]; char s2_with_space[MAX_LENGTH];
|
||||
// 填充带空格的字符串
|
||||
s1_with_space[0] = ' '; // 添加空格
|
||||
strcpy(s1_with_space + 1, s1); // 复制原字符串到新字符串
|
||||
s2_with_space[0] = ' '; // 添加空格
|
||||
strcpy(s2_with_space + 1, s2); // 复制原字符串到新字符串
|
||||
for (int i = 0; i <= len1; i++) { // 打印矩阵
|
||||
for (int j = 0; j <= len2; j++) {
|
||||
if (i == 0 && j <=len2) {
|
||||
printf("%c\t", s2_with_space[j]); // 打印第二行的字符
|
||||
} else if (j == 0 && i <= len1) {
|
||||
printf("%c\t", s1_with_space[i]); // 打印第一列的字符
|
||||
} else if (i > 0 && j > 0) {// 打印组合字符
|
||||
printf("%c%c\t", s1_with_space[i], s2_with_space[j]);
|
||||
}
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
Binary file not shown.
@@ -0,0 +1,50 @@
|
||||
#include <stdio.h>
|
||||
#include <time.h>
|
||||
|
||||
void doAddition(int iterations);
|
||||
void doMultiplication(int iterations);
|
||||
|
||||
int main() {
|
||||
const int iterations = 1000000000; // 操作次数
|
||||
const int repetitions = 10; // 重复测试的次数
|
||||
double totalAdditionTime = 0.0;
|
||||
double totalMultiplicationTime = 0.0;
|
||||
|
||||
// 重复测试加法
|
||||
for (int i = 0; i < repetitions; ++i) {
|
||||
clock_t begin = clock();
|
||||
doAddition(iterations);
|
||||
clock_t end = clock();
|
||||
totalAdditionTime += (double)(end - begin) / CLOCKS_PER_SEC;
|
||||
}
|
||||
printf("加法操作平均耗时: %.5f s\n", totalAdditionTime / repetitions);
|
||||
|
||||
// 重复测试乘法
|
||||
for (int i = 0; i < repetitions; ++i) {
|
||||
clock_t begin = clock();
|
||||
doMultiplication(iterations);
|
||||
clock_t end = clock();
|
||||
totalMultiplicationTime += (double)(end - begin) / CLOCKS_PER_SEC;
|
||||
}
|
||||
printf("乘法操作平均耗时: %.5f s\n", totalMultiplicationTime / repetitions);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
// 加法函数
|
||||
void doAddition(int iterations) {
|
||||
long long result = 0; // 使用 long long 以避免溢出
|
||||
for (int i = 0; i < iterations; ++i) {
|
||||
result += 1; // 简单的加法操作
|
||||
}
|
||||
// printf("Addition result: %lld\n", result); // 可以取消注释以验证结果
|
||||
}
|
||||
|
||||
// 乘法函数
|
||||
void doMultiplication(int iterations) {
|
||||
long long result = 1; // 使用 long long 以避免溢出
|
||||
for (int i = 0; i < iterations; ++i) {
|
||||
result *= 2; // 简单的乘法操作
|
||||
}
|
||||
// printf("Multiplication result: %lld\n", result); // 可以取消注释以验证结果
|
||||
}
|
||||
Binary file not shown.
@@ -0,0 +1,17 @@
|
||||
#include <stdio.h>
|
||||
|
||||
void pringDuijiao(int n) {
|
||||
for (int i = 0; i < n; i++) {
|
||||
for (int j = 0; j < n; j++) {
|
||||
if (i == j || i + j == n - 1)
|
||||
printf("*");
|
||||
printf(" ");
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
}
|
||||
|
||||
int main(){
|
||||
pringDuijiao(9);
|
||||
return 0;
|
||||
}
|
||||
Binary file not shown.
@@ -0,0 +1,39 @@
|
||||
#include <stdio.h>
|
||||
|
||||
void trace(int i, int j, int s[][5]) {
|
||||
if (i == j) {
|
||||
printf("A%d", i);
|
||||
} else {
|
||||
printf("(");
|
||||
trace(i, s[i][j], s); // 递归输出左边
|
||||
trace(s[i][j] + 1, j, s); // 递归输出右边
|
||||
printf(")");
|
||||
}
|
||||
}
|
||||
|
||||
int main() {
|
||||
int wei[] = { 2, 3, 4, 5, 6 };
|
||||
int s[5][5] = {
|
||||
{0, 0, 0, 0, 0},
|
||||
{0, 0, 1, 2, 2},
|
||||
{0, 0, 0, 2, 2},
|
||||
{0, 0, 0, 0, 3},
|
||||
{0, 0, 0, 0, 0}
|
||||
};
|
||||
|
||||
// 打印二维数组 s 的特定格式
|
||||
for (int i = 0; i < 5; i++) {
|
||||
for (int j = 0; j < 5; j++) {
|
||||
if (i == j || i + j == 4) // wei.length - 1 = 4
|
||||
printf("%d", s[i][j]);
|
||||
printf("\t");
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
// 打印括号表示法
|
||||
trace(1, 4, s); // wei.length - 1 = 4
|
||||
printf("\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
Binary file not shown.
@@ -0,0 +1,45 @@
|
||||
#include <stdio.h>
|
||||
#include <limits.h>
|
||||
void matrixChain(int p[], int m[][5], int s[][5], int n) {
|
||||
for (int i = 1; i <= n; i++) {
|
||||
m[i][i] = 0; // 初始化对角线
|
||||
}
|
||||
for (int d = 2; d <= n; d++) { // d为链的长度
|
||||
for (int i = 1; i <= n - d + 1; i++) { // i是起始位置
|
||||
int j = i + d - 1; // 结束位置
|
||||
m[i][j] = INT_MAX; // 初始化为无穷大
|
||||
for (int k = i; k < j; k++) {
|
||||
// 计算当前划分的最小值
|
||||
int t = m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j];
|
||||
if (t < m[i][j]) {
|
||||
m[i][j] = t; // 更新最小值
|
||||
s[i][j] = k; // 记录划分位置
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
//输出A[i,j]的最优计算次序
|
||||
void traceback(int i, int j, int s[][5]) {
|
||||
if (i == j) {
|
||||
printf("A%d", i); // 输出矩阵名
|
||||
} else {
|
||||
printf("(");
|
||||
traceback(i, s[i][j], s); // 递归输出左边
|
||||
traceback(s[i][j] + 1, j, s); // 递归输出右边
|
||||
printf(")");
|
||||
}
|
||||
}
|
||||
|
||||
int main() {
|
||||
int p[] = {6, 7, 8, 9, 10}; // 矩阵的维数
|
||||
int n = sizeof(p) / sizeof(p[0]) - 1; // 矩阵个数
|
||||
int m[6][5] = {0}; // 存放最优值的数组
|
||||
int s[6][5] = {0}; // 存放分割位置下标的数组
|
||||
matrixChain(p, m, s, n);
|
||||
printf("最优值为: %d\n", m[1][n]); // 输出最优值
|
||||
printf("最优计算次序为: ");
|
||||
traceback(1, n, s); // 输出最优计算次序
|
||||
|
||||
return 0;
|
||||
}
|
||||
Binary file not shown.
@@ -0,0 +1,26 @@
|
||||
#include <stdio.h>
|
||||
|
||||
void printAi(int arr[], int i, int length) {
|
||||
if (i < 1 || i >= length) {
|
||||
printf("值不符合要求.\n");
|
||||
} else {
|
||||
printf("矩阵A%d的维数:%d行x%d列\n",
|
||||
i, arr[i - 1], arr[i]);
|
||||
for (int m = 0; m < arr[i - 1]; m++) {
|
||||
for (int n = 0; n < arr[i]; n++) {
|
||||
printf("0\t");
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int main() {
|
||||
int arr[] = {2, 3, 4, 5, 6};
|
||||
int length = sizeof(arr) / sizeof(arr[0]);
|
||||
|
||||
// 打印矩阵 A2 的维数
|
||||
printAi(arr, 2, length);
|
||||
|
||||
return 0;
|
||||
}
|
||||
Binary file not shown.
Reference in New Issue
Block a user