#include<stdio.h>
#include<string.h>
#define MAXN 20
#define MAXW 100
int n,W;
int w[MAXN],v[MAXN];
//求解结果表示
int dp[MAXN+1][MAXW+1],fk[MAXN+1][MAXW+1];
int solve() //求解多重背包问题
{ int i,j,k;
for (i=1;i<=n;i++)
{ for (j=0;j<=W;j++)
for (k=0;k*w[i]<=j;k++)
{ if (dp[i][j]<dp[i-1][j-k*w[i]]+k*v[i])
{ dp[i][j]=dp[i-1][j-k*w[i]]+k*v[i];
fk[i][j]=k; //物品i取k件
}
}
}
return dp[n][W];
}
void Traceback() //回推求最优解
{ int i=n,j=W;
while (i>=1)
{ printf("物品%d共%d件 ",i,fk[i][j]);
j-=fk[i][j]*w[i]; //剩余重量
i--;
}
printf("\n");
}
Int main()
{
w[1]=3; w[2]=4; w[3]=2;
v[1]=4; v[2]=5; v[3]=3;
n=3;W=7;
memset(dp,0,sizeof(dp));
memset(fk,0,sizeof(fk));
printf("最优解: \n");
printf("总价值: %d\n",solve());
printf("方案: ");Traceback();
}
动态规划求解完全背包问题
猜你喜欢
转载自blog.csdn.net/dujuancao11/article/details/104207153
今日推荐
周排行