| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 683 人关注过本帖
标题:0/1 背包的动态规划实现(递归和非递归)
只看楼主 加入收藏
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
结帖率:94.72%
收藏
已结贴  问题点数:8 回复次数:2 
0/1 背包的动态规划实现(递归和非递归)
虽然主贴问题没有解决,但是解决问题的过程中写的2份代码应该有点参考价值,
扔了有点可惜,发出来给大家分享一下

程序代码:
#define CAP 17

vector<int> items = {3, 4, 7, 8, 9};
vector<int> values = {4, 5, 10, 11, 13};
vector<bool> isSelect(items.size());
vector<int> maxKnown(CAP+1);
vector<int> itemKnown(CAP+1);

int knap(int cap, int depth)
{
    int i, space, max, maxi, t;
    
    if (maxKnown[cap])
    {
        return maxKnown[cap];
    }
    
    for (i = 0, max = 0, maxi = -1; i < items.size(); i++)
    {
        if (!isSelect[i])
        {
            isSelect[i] = true;
            
            space = cap - items[i];

            if (space >= 0)
            {
                for (int j = 0; j < depth; j++)
                {
                    printf("  ");
                }
                
                printf("%d\n", space);
                
                t = knap(space, depth+1) + values[i];
                
                if (t > max)
                {
                    max = t;
                    maxi = i;
                }
            }
            
            isSelect[i] = false;
        }
    }
    
    maxKnown[cap] = max;
    itemKnown[cap] = maxi;
    
    return max;
}

int main(void)
{
     int max = knap(CAP, 0);
    
    if (max != 0)
    {
        printf("max = %d\n", max);
        int cap = CAP;
        vector<int> selected;
        
        while (itemKnown[cap] != -1 && cap - items[itemKnown[cap]] >= 0)
        {
            selected.push_back(items[itemKnown[cap]]);
            cap = cap - items[itemKnown[cap]];
        }
        
        for (int i = 0; i < selected.size(); i++)
        {
            printf("%d ", selected[i]);
        }
    }

    return 0;
}


程序代码:
#define CAP 17

vector<int> items = {9, 8, 7, 4, 3};
vector<int> values = {13, 11, 10, 5, 4};
vector<int> maxKnown(CAP+1);
vector<int> itemKnown(CAP+1);

int main(void)
{
    int i, j, space, max, maxi, t;
    
    for (i = 0; i <= CAP; i++)
    {
        for (j = 0, max = 0, maxi = -1; j < items.size() ; j++)
        {
            if ((space = i - items[j]) >= 0)
            {
                if ((t = maxKnown[space] + values[j]) > max)
                {
                    max = t;
                    maxi = j;
                }
            }
        }
        
        maxKnown[i] = max;
        itemKnown[i] = maxi;
    }
    
    if (max != 0)
    {
        printf("max = %d\n", max);
        int cap = CAP;
        vector<int> selected;
        
        while (itemKnown[cap] != -1 && cap - items[itemKnown[cap]] >= 0)
        {
            selected.push_back(items[itemKnown[cap]]);
            cap = cap - items[itemKnown[cap]];
        }
        
        for (int i = 0; i < selected.size(); i++)
        {
            printf("%d ", selected[i]);
        }
    }
    
    return 0;
}


[ 本帖最后由 BlueGuy 于 2015-6-19 12:29 编辑 ]
搜索更多相关主题的帖子: color 背包 动态 价值 
2015-06-17 20:39
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
以下是引用边小白在2015-6-18 06:10:40的发言:

不是有版主大大说是垃圾吗?还要放出来,一句注释都不写,你觉得有看的价值?

等你5年后学到这里的时候,你就知道代码的价值了

我就是真命天子,顺我者生,逆我者死!
2015-06-18 07:34
快速回复:0/1 背包的动态规划实现(递归和非递归)
数据加载中...
 
   



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

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