#include <stdio.h>
int main()
{
int choose[];
int w[]={};
int v[]={};
int totalw;
int opti[n+1][m+1];//用来保存容易为m时装前n个物体总价值
for(int i = 0; i <= n; i++)
opti[i][0] = 0; //容量为0时装前i个物体 总价值(装不下)为0
for(int i = 0; i <= m; i++)
opti[0][i] = 0; //容量为i时装前0个物体 总价值(没装)为0
for(int i = 1; i <= n; i++)//第i个物体 有两种策略 装与不装 不装则总价值为容量j装前i-1个物体,装总价值
//为opti[i-1][j-w[i]] + v[i] 显然取最大值
for(int j = 1; j <= m; j++)//用容量j去装
{
opti[i][j] = opti[i-1][j];//假设没能装下第i个物体,那么容量为j时装前i个物体最大价值
//与容量为j-1时装前i个物体最大价值一致
if(j >= w[i] && opti[i-1][j-w[i]] + v[i] > opti[i][j])
//容量为j,第i个物体装入后的价值大于没装时 应该装
opti[i][j] = opti[i-1][j-w[i]] + v[i];
}
for(int i = n; i >0 ; i--)
{
if(opti[n][m] > opti[n-1][m])//如果有装就大
{ choose[n] = 1;
m -= w[n];
}
}
}
01背包
最新推荐文章于 2022-12-13 21:54:25 发布