Bootstrap

背包问题——0/1背包(C语言)

代码如下:

#include<stdio.h>

int knapsack(int weight[], int values[], int n, int capacity)
{
	int** dp = (int**)malloc(sizeof(int*) * (n + 1));
	for (int i = 0; i <= n; i++)
	{
		dp[i] = (int*)malloc((capacity + 1) * sizeof(int));
	}

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

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

	for (int i = 1; i <= n; i++)//核心代码——动态规划
	{
		for (int j = 1; j <= capacity; j++)
		{
			if (weight[i - 1] > j)
			{
				dp[i][j] = dp[i - 1][j];
			}
			else
			{
				dp[i][j] = dp[i - 1][j] > (dp[i - 1][j - weight[i - 1]] + values[i - 1]) ? dp[i - 1][j] : (dp[i - 1][j - weight[i - 1]] + values[i - 1]);
			}
		}
	}

	int result = dp[n][capacity];

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

	free(dp);

	return result;
}

int main()
{
	int weight[] = { 1,2,3,4,5 };
	int values[] = { 5,4,3,2,1 };
	int n = sizeof(weight) / sizeof(weight[0]);
	int capacity = 8;
	int maxvalue = knapsack(weight, values, n, capacity);
	printf("背包能装下的最大价值为: %d\n", maxvalue);
	return 0;
}