背包问题——多重背包(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;
}
相关推荐
phltxy15 小时前
C 语言文件操作:让数据从内存走向持久化
c语言·网络·数据库
大圣编蚕15 小时前
C语言怎么写小游戏?从零开始做一个贪吃蛇
c语言·开发语言
Chen—LSN16 小时前
数据结构——拿捏复杂度
java·c语言·开发语言·数据结构·经验分享·笔记·算法
Chen_harmony16 小时前
六、排序详解
c语言·数据结构·算法·排序算法
她说彩礼65万16 小时前
C语言 单引号与双引号
java·服务器·c语言
dtq042416 小时前
数据结构 - 树的概念
c语言·数据结构·学习·算法
山下梅子酒22517 小时前
洛谷-入门-B2075
c语言
我就是不信17 小时前
C语言排序问题详解:从冒泡到快排的完整指南
c语言·算法·排序算法
奇牙coding17 小时前
Codex C接 配置教程:的 字段从迁移时必须写完整后缀,填旧值或省略 会静默回退默认模型
java·c语言·数据库·ai
左手の明天1 天前
SLIP 协议封装与解析详解:原理、C 代码与实战案例
linux·c语言·开发语言·c++