背包问题——多重背包(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;
}
相关推荐
co0t8 小时前
考研c语言复习之栈
c语言·开发语言·考研
水饺编程10 小时前
计算机基础:编码03,根据十进制数,求其原码
c语言·c++·windows·mfc
小檀61012 小时前
C语言基础08
c语言·算法·排序算法
丶七年先生13 小时前
ubuntu20.04下的opencv4.8.0安装教程(其他版本通用)
linux·c语言
珹洺14 小时前
C++从入门到实战(五)类和对象(第一部分)为什么有类,及怎么使用类,类域概念详解(附带图谱等更好对比理解)
java·c语言·开发语言·数据结构·c++·redis·缓存
笑口常开xpr14 小时前
C 语 言 --- 扫 雷 游 戏(初 阶 版)
c语言·开发语言
Cindy辛蒂14 小时前
C语言:穷举法编程韩信点兵问题四种做法
c语言·开发语言·算法
niuTaylor15 小时前
嵌入式硬件工程师从小白到入门-速通版(一)
linux·c语言·嵌入式硬件
爱编程的小赵16 小时前
第十五届蓝桥杯C/C++组:宝石组合题目(从小学奥数到编程题详解)
c语言·c++·蓝桥杯
graceyun16 小时前
初阶数据结构(C语言实现)——6.1插入排序详解(思路图解+代码实现)
c语言·数据结构·排序算法