c语言按行读取txt文件,并用字符串保存,遇到空格就将这个字符串转化成等值整型,读取出的数据用于解决01背包问题每行都要写注释
时间: 2024-01-08 11:04:03 浏览: 217
c语言,怎样输出有空格的字符串?.txt
5星 · 资源好评率100%
好的,以下是按行读取txt文件,并用字符串保存,遇到空格就将这个字符串转化成等值整型,读取出的数据用于解决01背包问题的C语言代码,每行都有注释:
```c
#include <stdio.h>
#include <string.h>
#define MAX_ITEMS 100 // 最大物品数量
#define MAX_WEIGHT 1000 // 最大背包容量
int main() {
FILE *fp; // 文件指针
char buffer[100]; // 用于存储每行文本的缓冲区
char *token; // 用于存储分割出的字符串
char str[10]; // 用于存储分割出的字符串
int item_weights[MAX_ITEMS]; // 物品重量数组
int item_values[MAX_ITEMS]; // 物品价值数组
int dp[MAX_WEIGHT + 1] = {0}; // 背包问题中的动态规划数组
int num_items = 0; // 物品数量
int max_weight = 0; // 背包容量
fp = fopen("file.txt", "r"); // 打开文件,只读模式
if (fp == NULL) { // 如果打开文件失败,输出错误信息并退出程序
printf("Failed to open file\n");
return 1;
}
// 逐行读取文件内容,存储到buffer中
while (fgets(buffer, 100, fp)) {
token = strtok(buffer, " "); // 每行文本按空格分割,获取第一个字符串
if (num_items == 0) { // 第一行数据为背包容量和物品数量
sscanf(token, "%d", &max_weight); // 将第一个字符串转换为背包容量
token = strtok(NULL, " "); // 获取下一个分割出的字符串
sscanf(token, "%d", &num_items); // 将下一个字符串转换为物品数量
} else { // 接下来的每一行为一个物品的重量和价值
sscanf(token, "%d", &item_weights[num_items - 1]); // 将第一个字符串转换为物品重量
token = strtok(NULL, " "); // 获取下一个分割出的字符串
sscanf(token, "%d", &item_values[num_items - 1]); // 将下一个字符串转换为物品价值
num_items++; // 物品数量加1
}
}
fclose(fp); // 关闭文件
// 解决01背包问题
for (int i = 0; i < num_items; i++) { // 遍历每个物品
for (int j = max_weight; j >= item_weights[i]; j--) { // 从大到小遍历每个容量
dp[j] = dp[j] > dp[j - item_weights[i]] + item_values[i] ? dp[j] : dp[j - item_weights[i]] + item_values[i];
// 动态规划转移方程
}
}
printf("The maximum value of 01 knapsack problem is %d\n", dp[max_weight]); // 输出解决方案的最大价值
return 0;
}
```
请注意,这个例子中假设文件中第一行为背包容量和物品数量,接下来每一行为一个物品的重量和价值,数据都是以空格分隔的。如果文件格式不同,请适当修改代码。同时,这个例子使用了strtok函数,这个函数在多线程环境下不安全,如果需要在多线程环境下使用,请使用strtok_r函数。
阅读全文