背包问题——多重背包(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;
}
相关推荐
遇见尚硅谷12 小时前
C语言:游戏代码分享
c语言·开发语言·算法·游戏
Jess0713 小时前
归并排序递归法和非递归法的简单简单介绍
c语言·算法·排序算法
双叶83614 小时前
(C++)STL标准库(vector动态数组)(list列表)(set集合)(map键值对)相关对比,基础教程
c语言·开发语言·数据结构·c++·list
j_xxx404_16 小时前
c语言:字符函数和字符串函数
c语言·开发语言
apocelipes17 小时前
C23和C++26的#embed嵌入资源指南
c语言·c++·开发工具和环境·c23·c++26
liweiweili12619 小时前
GPT和MBR分区
c语言
菜鸟12号19 小时前
详解Linux下多进程与多线程通信(一)
linux·c语言·嵌入式·进程与线程
学不动CV了19 小时前
深入理解C语言内存空间、函数指针(三)(重点是函数指针)
c语言·arm开发·数据库·stm32·单片机·嵌入式硬件·c#
2301_7811435621 小时前
江协科技STM32入门教程——通信接口
c语言·嵌入式
定偶1 天前
C语言中整数编码方式(原码、反码、补码)
c语言·数据结构·编辑器