| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 515 人关注过本帖
标题:多重背包单调队列优化核心的地方不懂,文章里面具体说明
只看楼主 加入收藏
qiqid
Rank: 2
等 级:论坛游民
帖 子:36
专家分:12
注 册:2013-3-31
结帖率:100%
收藏
 问题点数:0 回复次数:1 
多重背包单调队列优化核心的地方不懂,文章里面具体说明
我从网上查找资料学习这个知识的,不懂的地方是当判断物品既不是01背包,也不是完全背包时,之后的语句意思就分析不清楚了。我把别人的代码写下来:

题目大意:给你N(1 ≤ N ≤ 100)种钞票以及拥有的张数,以及一个给定的值M(1 ≤ M ≤ 100,000 )。你需要统计出用这些钞票能够凑出来的钱数,在1 - M的范围中有多少个。

 for (i = 1; i <= n; i++)
        {
            maxi = w[i] * s[i];
            if (s[i] == 1)
            {
                for (j = m; j >= w[i]; j--)
                    dyna[j] = max(dyna[j], dyna[j - w[i]]);
            }
            else if (maxi < m)
            {
                for (j = 0; j < w[i]; j++)
                {
                    head = tail = 0;
                    for (k = j; k <= m; k += w[i])
                    {
                        if (tail != head) { if (k - pl[head] > maxi) head++; }
                        if (dyna[k])
                        {
                            dqueue[tail] = dyna[k];
                            pl[tail] = k; tail++;
                        }
                        else if (tail != head) dyna[k] = 1;
                    }
                }
            }
            else
            {
                for (j = w[i]; j <= m; j++)
                    dyna[j] = max(dyna[j], dyna[j - w[i]]);
            }
        }

每个变量的意思:数组dyna就是DP的那个数组了,maxi变量用于判断物品属于完全背包,还是多重背包。head跟tail用来指示队列的头和尾。
搜索更多相关主题的帖子: 文章 背包 统计 网上 知识 
2014-07-17 01:23
qiqid
Rank: 2
等 级:论坛游民
帖 子:36
专家分:12
注 册:2013-3-31
收藏
得分:0 
不懂的代码就是
for (j = 0; j < w[i]; j++)
                {
                    head = tail = 0;
                    for (k = j; k <= m; k += w[i])
                    {
                        if (tail != head) { if (k - pl[head] > maxi) head++; }
                        if (dyna[k])
                        {
                            dqueue[tail] = dyna[k];
                            pl[tail] = k; tail++;
                        }
                        else if (tail != head) dyna[k] = 1;
                    }
                }
两个for循环不懂

为什么这样循环怎样不懂
2014-07-17 01:24
快速回复:多重背包单调队列优化核心的地方不懂,文章里面具体说明
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.036257 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved