问题描述
有n个集装箱要装上一艘载重量为W的轮船,其中集装箱i(1<=i<=n)的重量为wi,不考虑集装箱的体积限制,现在从这些集装箱中选出重量和小于等于W并且尽可能大的若干装上轮船。例如
n = 5,W = 10,w = {5,2,6,4,3}时,其最佳方案为?
问题求解
代码实现
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
#define Maxn 20 //最大问题规模
//问题描述
/*有5个物品,重量分别如数组里所示,要求选择装入货轮使得所装载的重量最大且不超过最大限重,
* 本题采用动态规划数组求解,画出动态数组*/
int W = 10;
int n = 5;
int w[] = {0,5,2,6,4,3};
int dp[Maxn][Maxn];
int maxw = 0;
int op[Maxn];
void knap(int n,int we)
{
//初始化
for(int i = 0;i <= n;i++)
dp[i][0] = 0;
for(int j = 0;j <= we;j++)
dp[0][j] = 0;
//填表
for(int i = 1;i <= n;i++)
for(int r = 1;r <= we;r++)
{
//如果不能选择,取上面的那个
if(r < w[i] )
dp[i][r] = dp[i-1][r];
else //否则取选或不选的最大值
dp[i][r] = max(dp[i-1][r],w[i] + dp[i-1][r-w[i]]);
}
}
void Build(int n,int we)//构建
{
int i = n;
int r = we;
while(i >= 0)
{
if(dp[i][r] != dp[i-1][r])
{
op[i] = 1;
maxw+=w[i];
r = r - w[i];
}
else
op[i] = 0;
i--;
}
}
int main() {
knap(n,W);
printf("装载方案为:\n");
Build(n,W);
for(int i = 1;i <= n; i++)
{
if(op[i] == 1)
printf("%d ",i);
}
printf("最大重量为: %d",maxw);
return 0;
}