代码如下:
#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;
}