又是转载哦~~不过,好东西大家一起分享,一起学习哦~~~今天去腾讯QQ笔试,出了这么一题:有一个背包,能盛放的物品总重量为S,设有N件物品,其重量分别为w1,w2,...,wn.希望从N件物品中选择若干件物品,所选物品的重量之和恰能放入该背包,即所选物品的重量之和等于S。

1、递归算法

#include <iostream>
#include <stdlib.h>

using namespace std;

const int N=7;
const int S=20;
int w[N+1]={0,1,4,3,4,5,2,7};

int knap(int s,int n)
{
    if(s==0)return 1;
    if(s<0||(s>0&&n<1))return 0;
    if(knap(s-w[n],n-1))
    {
        cout<<w[n];
        return 1;
    }
    return knap(s,n-1);   
}

int main(int argc, char *argv[])
{
    if(knap(S,N))cout<<endl<<"OK"<<endl;
    else cout<<"NO"<<endl;
    system("PAUSE"); 
    return 0;
}

2、非递归算法

#include <iostream>
#include <stdlib.h>

using namespace std;

const int N=7;
const int S=20;
int w[N+1]={0,1,4,3,4,5,2,7};

typedef struct

{
    int s;
    int n;
    int job;
}KNAPTP;
   
int knap(int s,int n)
{
    KNAPTP stack[100],x;
    int top,k,rep;
    x.s=s;
    x.n=n;
    x.job=0;
    top=1;
    stack[top]=x;
    k=0;
    while(k==0&&top>0){
        x=stack[top];
        rep=1;
        while(!k&&rep){
            if(x.s==0)k=1;
            else if(x.s<0||x.n<=0)rep=0;
            else {
                x.s=x.s-w[x.n--];
                x.job=1;
                stack[++top]=x;
                }
            }
            if(!k){
                rep=1;
                while(top>=1&&rep){
                    x=stack[top--];
                    if(x.job==1){
                        x.s+=w[x.n+1];
                        x.job=2;
                        stack[++top]=x;
                        rep=0;
                        }
                    }
                }
        }
        if(k){
            while(top>=1){
                x=stack[top--];
                if(x.job==1)cout<<w[x.n+1];
                }
            }
            return k;
}
int main(int argc, char *argv[])
{
     if(knap(S,N))cout<<endl<<"OK"<<endl;
     else cout<<"NO"<<endl;
     system("PAUSE"); 
     return 0;
}

本文算法原帖如下:http://blog.csdn.net/alex197963/archive/2007/05/11/1604462.aspx

特此向原作者表示感谢!

posted on 2008-10-12 16:36  魔之左眼  阅读(2651)  评论(3编辑  收藏  举报