| 编程中国 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛
全能ASP/PHP/ASP.NET主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付学习型 ASP/PHP/ASP.NET 主机 30元/年
高端软件开发 = 年薪十万不是梦赛孚耐:软件保护加密专家身份认证令牌USB KEY 
共有 1663 人关注过本帖
标题:求0/1背包问题的非递归算法
收藏  订阅  推荐  打印 
limeng_HOHO
Rank: 2
来自:吉林大学
等级:注册会员
帖子:41
积分:510
注册:2007-7-16
求0/1背包问题的非递归算法

设被包容量为m,有n件物品,质量为m1,m2,...mn,均为正整数,要从n件物品中挑选若干使得背包质量之和正好为m。
书上给了递归算法,我想知道非递归算法,谢谢各位了
搜索更多相关主题的帖子: 非递归  算法  背包  物品  质量  
2007-10-12 20:04
卧龙孔明
Rank: 12Rank: 12Rank: 12
等级:版主
威望:47
帖子:3702
积分:39046
注册:2006-10-13

可以用DP

为了中国软件工业的未来,有爱心的朋友请不要帮忙代做作业,或者至少是收费服务!如果您不需要钱,或者您不愿收费用于自己,请把收取的钱用于支援山区贫困学生…谢谢大家!
2007-10-12 20:39
永夜的极光
Rank: 12Rank: 12Rank: 12
等级:版主
威望:17
帖子:2668
积分:34025
注册:2007-10-9

据说递归算法都可以转变成非递归的算法


从BFS(Breadth First Study)到DFS(Depth First Study)
学习VIM中,欢迎访问我的blog  http://hi.baidu.com/newkedison
严重鄙视一切把论坛当成作业生成器和人肉搜索引擎的人
2007-10-12 21:01
pinglideyu
Rank: 4
来自:武汉工程大学
等级:高级会员
威望:1
帖子:679
积分:6916
注册:2007-1-7

数据结构这本书上有讲怎么样将递归算法都可以转变成非递归的算法

~~我的明天我知道~~
2007-10-12 21:03
leeco
Rank: 4
等级:高级会员
威望:8
帖子:870
积分:9662
注册:2007-5-10


程序代码:

<BR>#define MAXC 60000<BR>int _dp[2][MAXC+1];<BR>struct{<BR> int* operator [] (int i){<BR> return _dp[i&amp;1];<BR> }<BR>}dp;</P> <P>int knapsack(int* w,int* v,int n,int c){ <BR> for(int r=0;r&lt;=c;r++){<BR> if(w[0]&gt;r)dp[0][r]=0;<BR> else dp[0][r]=v[0];<BR> } <BR> for(int k=1;k&lt;n;k++){<BR> dp[k][0]=0;<BR> for(int r=1;r&lt;=c;r++){<BR> dp[k][r]=dp[k-1][r];<BR> if(r&gt;=w[k] &amp;&amp; dp[k-1][r-w[k]]+v[k]&gt; dp[k][r]){<BR> dp[k][r]=dp[k-1][r-w[k]]+v[k];<BR> }<BR> }<BR> }<BR> return dp[n-1][c];<BR>}<BR>

2007-10-12 21:09
limeng_HOHO
Rank: 2
来自:吉林大学
等级:注册会员
帖子:41
积分:510
注册:2007-7-16
回复:(pinglideyu)数据结构这本书上有讲怎么样将递...

是有 我也看了 但是没看明白。。。。。


只做一件事并且做好
2007-10-12 22:31
zhangyuan2000
Rank: 1
等级:新手上路
帖子:1
积分:210
注册:2008-11-1
背包问题

#include<iostream>
using namespace std;
#include<stdlib.h>
#define max 100

void Init_fun(int num);
void DiGui_fun(float a[], int b[], float tatol, int i, float T, int num);

int main()
{
    int num;

    cout<<"请输入你要输入物体得个数:";
    cin>>num;

    Init_fun( num );

    return 0;
}

void Init_fun(int num)
{
    int counter, i=0;
    float a[max];
    int b[max];
    float T=0, tatol=0;

    cout<<"请输入元素";
    a[0]=0;
    for(counter=1; counter<=num; counter++)
        cin>>a[counter];

    for(counter=0; counter<=num; counter++)
        b[counter]=0;
    
    cout<<"输入总重量:";
    cin>>T;

    DiGui_fun(a, b, tatol, i, T, num+1);

}


void DiGui_fun(float a[], int b[], float tatol, int i, float T, int num)
{
    
    tatol=tatol + a[i];
    
    if(tatol==T){
        for(int j=1; j<=i; j++){
            if(b[j]==1)
                cout<<a[j]<<"\t";
        }
        cout<<"\n";
    }
    else{
        for(int n=i+1; n<=num; n++){
            b[n]=1;
            DiGui_fun(a, b, tatol, n,T, num );
            b[n]=0;
        }
    }
}
2008-11-1 22:00
关于我们 | 广告合作 | 编程中国 | 清除Cookies | Archiver | WAP | TOP

编程中国 版权所有,并保留所有权利。鲁ICP备08000592号
Powered by Discuz, Processed in 0.163493 second(s), 9 queries.
Copyright©2004-2008, BCCN.NET, All Rights Reserved