动态规划法解决01背包问题(C++实现)

问题描述:给定n种商品和一个给定固定容量的背包。物品 i 的重量是W[ i ],价值为V[ i ],背包的容量为C。问应当如何选择装入背包中的物品,使得装入背包中的物品的总价值最大?

(对于同一个物品,要么放,要么不放,不能把物品放入背包多次,也不能将物品分割后部分装入,因此该问题称为 0 - 1背包问题)

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;

int tableTwo[10][100];
int flag[10] = {
    -1 };
 
//从n->1计算 。自底向上,自左向右
int KnapsackTwo(vector<int> v, vector<int> w, int c, int n) {
      
	int jMax = min(w[n] - 1, c);
	for (int j = 0; j<jMax; j++)
		tableTwo[n][j] = 0;	//j<当前背包容量或者当前物品重量时,tableTwo[n][j]=0;   
	for (int j = w[n]; j <= c
好的,下面是用C语言实现动态规划解决01背包问题的代码: ```c #include <stdio.h> #include <stdlib.h> // 定义物品结构体 typedef struct Item { int weight; // 物品重量 int value; // 物品价值 } Item; // 动态规划函数 int knapsack(Item* items, int n, int W) { int i, w; int** K = (int**) malloc((n + 1) * sizeof(int*)); // 申请二维数组 for (i = 0; i <= n; i++) { K[i] = (int*) malloc((W + 1) * sizeof(int)); } // 填充二维数组 for (i = 0; i <= n; i++) { for (w = 0; w <= W; w++) { if (i == 0 || w == 0) { // 初始化第一行和第一列为0 K[i][w] = 0; } else if (items[i - 1].weight <= w) { // 当前物品可以装入背包 int val1 = items[i - 1].value + K[i - 1][w - items[i - 1].weight]; // 装入该物品的最大价值 int val2 = K[i - 1][w]; // 不装入该物品的最大价值 K[i][w] = (val1 > val2) ? val1 : val2; // 取最大值 } else { // 当前物品无装入背包 K[i][w] = K[i - 1][w]; } } } int result = K[n][W]; // 获取最终结果 // 释放动态申请的内存 for (i = 0; i <= n; i++) { free(K[i]); } free(K); return result; } int main() { int W = 50; // 背包最大承重 Item items[] = {{10, 60}, {20, 100}, {30, 120}}; // 物品数组 int n = sizeof(items) / sizeof(items[0]); // 物品数量 int max_value = knapsack(items, n, W); // 动态规划求解 printf("The maximum value is %d\n", max_value); return 0; } ``` 上述代码中,我们定义了一个`Item`结构体,它包含了物品的重量和价值,然后我们通过`knapsack`函数进行动态规划求解,最后输出最大的价值。代码中使用了二维数组来存储物品的最大价值,其中`K[i][w]`表示前i个物品在承重为w的情况下的最大价值。在求解过程中,我们首先初始化第一行和第一列为0,然后根据当前物品是否可以装入背包进行状态转移,最后得到最终结果。 需要注意的是,动态申请的内存需要在程序结束后手动释放,以避免内存泄漏。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值