背包问题——多重背包(C语言)

代码如下:

复制代码
#include<stdio.h>

int knapsack(int weight[], int value[], int count[], int n, int capacity)
{
	int* dp = (int*)malloc(sizeof(int) * (capacity + 1));

	for (int i = 0; i <= capacity; i++)
	{
		dp[i] = 0;
	}

	for (int i = 0; i < n; i++)//核心代码
	{
		for (int j = capacity; j >= weight[i]; j--)
		{
			for (int k = 0; k <= count[i] && k * weight[i] <= j; k++)
			{
				if (dp[j] < dp[j - k * weight[i]] + value[i] * k)
				{
					dp[j] = dp[j - weight[i] * k] + k * value[i];
				}
			}
		}
	}

	int result = dp[capacity];

	free(dp);
	return result;
}

int main()
{
	int weight[] = { 1,2,3 };//物品重量
	int value[] = { 3,2,1 };//物品价值
	int count[] = { 2,2,2 };//物品数量
	int n = sizeof(weight) / sizeof(weight[0]);//物品种类
	int capacity = 9;//背包容量
	int valuemax = knapsack(weight, value, count, n, capacity);
	printf("背包能装下的最大价值为: %d\n", valuemax);
	return 0;
}
相关推荐
李绍熹15 分钟前
c语言字符串操作示例
c语言
Damon_X24 分钟前
extern “C“
c语言
GoWjw2 小时前
在C&C++指针的惯用方法
c语言·开发语言·c++
Coding Peasant2 小时前
GD32E230 I2C从机功能深度解析与实现指南
c语言·stm32·单片机·mcu·arm
superman超哥2 小时前
仓颉语言中错误恢复策略的深度剖析与工程实践
c语言·开发语言·c++·python·仓颉
玖剹2 小时前
记忆化搜索题目(二)
c语言·c++·算法·leetcode·深度优先·剪枝·深度优先遍历
搬砖的kk2 小时前
Lycium++ - OpenHarmony PC C/C++ 增强编译框架
c语言·开发语言·c++
fantasy_arch3 小时前
pd_process.c 文件源码分析
c语言·数据库·视频编解码·av1
黎雁·泠崖7 小时前
C 语言指针进阶教程:const 修饰、野指针规避与传址调用
c语言·开发语言
历程里程碑9 小时前
C++ 17异常处理:高效捕获与精准修复
java·c语言·开发语言·jvm·c++