首页 > 其他 > 详细

C-01背包问题

时间:2014-03-02 18:38:24      阅读:482      评论:0      收藏:0      [点我收藏+]

【声明】:非常感谢http://blog.sina.com.cn/s/blog_6dcd26b301013810.html,给我带来的帮助。

bubuko.com,布布扣

看这个图片表示的意思:

w[i]表示第i件物品的容积 ,p[i]第i件物品的价值。

c[i][j] 表示 第i件物品装入容积为j 的空间中的最高价值。 其中i是物品编号,j代表当前背包的容积。

非常重要的状态转移方程:

  C[i][j] = max(C[i-1][j],C[i-1][j-w[i]]+p[i])

C[i-1][j]表示放第i-1件物品,背包容量为j的总价值。

C[i-1][j-w[i]]表示存放第i-1件物品,背包容量为  j-w[i] 的总价值;再加上当前第i件物品的价值

【也就是说在选择是不是要放一件物品时,就看看不放该物件的价值 与 放了该物件的总价值 哪个更大一点的问题。】

 

bubuko.com,布布扣
int knapsack(int m,int n)//总容量,物品数量
{
    int i,j,w[10],p[10];//每件物品的容量个价值
    for(i=1;i<n+1;i++)
    scanf("\n%d,%d",&w[i],&p[i]);

    for(i=0;i<10;i++)
        for(j=0;j<100;j++)
            c[i][j]=0;

    for(i=1;i<n+1;i++)//数量
        for(j=1;j<m+1;j++)
        {
            if(w[i]<=j){//j表示当前容量,当前容量如果小于该件物品的容量,
                        //也就是该件物品放不进去背包
                 if(p[i]+c[i-1][j-w[i]]>c[i-1][j])
                     c[i][j]=p[i]+c[i-1][j-w[i]];
                 else
                     c[i][j]=c[i-1][j];
            }else

                 c[i][j]=c[i-1][j];
         }
     return(c[n][m]);
}
bubuko.com,布布扣

C-01背包问题,布布扣,bubuko.com

C-01背包问题

原文:http://www.cnblogs.com/plxx/p/3575583.html

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