Networking /C++/Linux

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  11 Posts :: 14 Stories :: 1 Comments :: 0 Trackbacks

常用链接

留言簿(4)

我参与的团队

搜索

  •  

最新评论

阅读排行榜

评论排行榜

计算机算法设计与分析(第三版)P78
背包问题:
m(i,j) = (1). max{m[i+1][j],m[i+1][j-w[i]]+v[i]}
           (2).m[i+1][j]

m(n,j) = (1) v[n] j>=w[n]
            (2) 0 0<=j<w[n]

m[i][j]:表示背包容量为j,可选择的物品为i,i+1,....,n是0-1背包问题的最优值。


#include<iostream>
#include<time.h>
#include<stdlib.h>
using namespace std;

#define N 5
#define C 25

int m[N+1][C+1];

//#define MAX(a,b)  ((a)>(b)?(a):(b))

int Min(int a,int b)
{
        return a<b?a:b;
}

int Max(int a,int b)
{
        return a>b?a:b;
}

void print(int *x)
{
        for(int i=1;i<=N;i++)
        {
              cout<<x[i]<<"\t";
        }
        cout<<endl;
}

void fb(int *w)
{
       cout<<"\n";
       
        int x[N+1];
        int c=C;
        
        for(int i=0;i<=N;i++)
        {
                x[i]=-1;
        }
        
        for(int i=1;i<N;i++)
        {
                if(m[i][c]==m[i+1][c]){
                        x[i]=0;
                }
                else{
                        x[i]=1;
                        c-=w[i];
                        cout<<w[i]<<"\t";
                }
        }
        
        cout<<endl;
        
        x[N] = (m[N][c])?1:0;
        print(x);
}


void f(int *w,int *v)
{        
        int max = Min(w[N]-1,C);
        //int max = min(w[N],C);
        for(int i=0;i<=N;i++)
        {
                for(int j=0;j<=C;j++)
                {
                        m[i][j]=-1;
                }
        }
        
        
        
        for(int j=0;j<max;j++)
        {
                m[N][j] = 0;
        }
        
        for(int j=max;j<=C;j++)
        {
                m[N][j] = v[N];
        }
        
        for(int i=N-1;i>1;i--)
        {
                max = Min(C,w[i]-1);
                //max = min(C,w[i]);
                for(int j=0;j<max;j++)
                {
                        m[i][j]=m[i+1][j];
                }
                
                for(int j=w[i];j<=C;j++)
                {
                        m[i][j] = Max(m[i+1][j],m[i+1][j-w[i]]+v[i]);
                }
        }
        
        m[1][C] = m[2][C];
        if(C>=w[1]){
                m[1][C] = Max(m[1][C],m[2][C-w[1]]+v[1]);
        }
        
        //print(m);
        
        for(int i=1;i<=N;i++)
        {
                for(int j=1;j<=C;j++)
                {
                        cout<<m[i][j]<<" ";
                }
                cout<<endl;
        }
        
        
        fb(w);
        
             
}

int main()
{
        int i;
        int w[N],v[N];
        
        srand(time(NULL));
        for(i=1;i<=N;i++)
        {
                w[i]=rand()%10;
                v[i]=rand()%25;
        }
        
        f(w,v);
        
        return 0;
}
posted on 2011-12-12 20:07 likun 阅读(170) 评论(0)  编辑 收藏 引用 所属分类: C/C++

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理