首页 > 编程语言 > 详细

背包算法

时间:2020-02-16 23:14:13      阅读:56      评论:0      收藏:0      [点我收藏+]

虽然大佬已经为我们罗列了背包九讲:https://blog.csdn.net/m0_37809890/article/details/83153974

但是我觉得自己还是要再罗列

01背包

有n件物品,每件物品的重量为w[i],价值为c[i]。现有一个容量为V的背包,问如何选取物品放入背包,使得背包内物品的总价值最大。

其中每种物品都只有一件。

令dp[i][j]来表示前i件物品装入容量为j的背包所能得到的最大总价值。

对于dp[i][j]来说,i指的是前i件物品,j指的是还剩下多少背包空间

memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++) scanf("%d",&value[i]);//输入价值
for(int i=1;i<=n;i++) scanf("%d",&volume[i]);//输入体积
for(int i=1;i<=n;i++)
for(int j=0;j<=v;j++)
if(j<volume[i])//如果背包体积小于物品体积,就看放前一个物品后的体积
dp[i][j]=dp[i-1][j];//j存放的是放进去的体积
else
dp[i][j]=max(dp[i-1][j],dp[i-1][j-volume[i]]+value[i]);//与前一个进行比较,看看前一个的价值与这当下价值哪个更大进行保存
printf("%d\n",dp[n][v] );

优化之后

 

int n=read(),v=read();
        for(int i=1;i<=n;i++)value[i]=read();
        for(int i=1;i<=n;i++)volume[i]=read();
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++)
            for(int j=v;j>=volume[i];j--)
                dp[j]=max(dp[j],dp[j-volume[i]]+value[i]);
        printf("%d\n",dp[v] );

 

 

 

背包算法

原文:https://www.cnblogs.com/-113/p/12319149.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!