动态规划C语言

#include <stdio.h>

#include <stdlib.h>

//0-1背包问题是一种经典的组合优化问题,

//问题描述为:有一个给定容量的背包和一组具有不同价值和重量的物品,如何选择物品放入背包中,以使得背包中物品的总价值最大化,同时不超过背包的容量限制。

#define max(a, b) ((a) > (b) ? (a) : (b))

int knapsack(int W, int wt[], int val[], int n) {//背包函数这是一个名为knapsack的函数,它接受四个参数:

//W:表示背包的总容量。

//wt[]:一个整数数组,表示每个物品的重量。

//val[]:一个整数数组,表示每个物品的价值。

//n:表示物品的数量。

int i, w;

int K[n+1][W+1]; // 填充 K()() 数组

for (i = 0; i <= n; i++) {//遍历每个物品

for (w = 0; w <= W; w++) {//遍历背包容量

if (i == 0 || w == 0) {

K[i][w] = 0;

} else if (wt[i-1] <= w) {// 如果物品i的重量wt[i-1]小于等于背包容量w,

K[i][w] = max(val[i-1] + K[i-1][w-wt[i-1]], K[i-1][w]);

//可以将物品i放入背包,或者不放入背包。在这两种情况下,选择能够获得更大总价值的方案,并将对应的价值存储在K[i][w]中。

} else {//如果物品i的重量wt[i-1]大于背包容量w,那么物品i无法放入背包,因此K[i][w]的值保持不变,即等于K[i-1][w]。

K[i][w] = K[i-1][w];

}

}

}

return K[n][W];//即表示在给定背包容量和物品重量、价值的情况下,能够装入背包的物品的最大总价值。

}

int main() {

int val[] = {60, 100, 120};

int wt[] = {10, 20, 30};

int W = 50;

int n = sizeof(val) / sizeof(val[0]);//物品的数量

printf("背包中能装的最大价值为:%d\n", knapsack(W, wt, val, n));

return 0;

}

相关推荐
深思慎考8 分钟前
数据结构——二叉搜索树
数据结构
尘心cx11 分钟前
数据结构-顺序表的应用
数据结构
毅凉22 分钟前
Linux笔记
linux·c语言·网络·数据库
hope_wisdom29 分钟前
Python面试宝典第49题:字符串压缩
python·算法·面试·笔试题·字符串压缩·双指针法·使用栈
MATLAB代码顾问42 分钟前
如何用MATLAB计算多边形的几何中心
算法·机器学习·matlab
栩日月44 分钟前
Linux学习记录十四----------线程的创建和回收
linux·数据结构·学习
戊子仲秋1 小时前
【LeetCode】每日一题 2024_9_13 预算内的最多机器人数目(滑动窗口、单调队列)
算法·leetcode
CV金科1 小时前
蓝桥杯-STM32G431RBT6(UART解析字符串sscanf和解决串口BUG)
c语言·stm32·单片机·嵌入式硬件·mcu·算法·bug
机器学习之心1 小时前
顶刊算法 | 鹈鹕算法POA-Transformer-LSTM多变量回归预测
算法·lstm·transformer·多变量回归预测·poa
WenGyyyL1 小时前
面试经典150题——多数元素
算法·哈希表·摩尔算法