zoukankan      html  css  js  c++  java
  • 简单背包问题-递归非递归实现

    递归实现

    #include<stdio.h>
    #define MAX 100
    int w[MAX]={0,1,2,3,4,5};
    int ans(int s,int m)
    {
        int s1,b,i;
        if(s==0)return 1;
        else if(s<w[0]||m<0)return 0;
        else
        {
            for(i=m;i>=0;i--)
            {
                s1=w[i];
                b=ans(s-s1,i-1);
                if(b==1)break;
            }
            if(!b)return 0;
            else
            {
                printf("%d
    ",s1);
                return 1;
            }
        }
    }

    非递归实现

    int Ans(int s,int m)
    {
        typedef struct
        {
            int s;
            int m;
        }stacknode;
        stacknode stack[MAX];
        int i,j,t,top,nofail;
        t=0;top=0;nofail=1;//i为当前已选择的重量,nofail为还无法确认求解失败
        while(s!=t&&nofail)//当还没有选择足够重量并且无法确认失败时
        {
            if(s>=t+w[1]&&m>0)//至少还能选择一个物品
            {
                stack[top].s=w[m];//选择该物品,并将其入栈
                stack[top].m=m;
                top++;
                t=t+w[m];//当前重量更新
                
                m--;//接着下一个物品
            }
            else
            {
                if(m==0)//刚才一个选择不合适,需要回溯
                {
                    top--;
                    t=t-stack[top].s;
                }
                if(top<1)nofail=0;//栈空,判断失败
                else//栈顶元素选择不合适,从其前一个元素开始重新选择
                {
                    top--;
                    m=stack[top].m-1;
                    t=t-stack[top].s;
                }
            }
        }
        if(s==t)
            for(i=0;i<top;i++)
            printf("%d
    ",stack[i].s);
    }


    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    运算符优先级口诀
    [转] 从最大似然到EM算法浅解
    推荐系统实践整体化总结
    Python-函数
    Python-dict/set
    Python-条件、循环、
    Python-list and tuple
    优先级顺序表
    8.1python类型注解
    9.redis-CacheCloud
  • 原文地址:https://www.cnblogs.com/Thereisnospon/p/4768516.html
Copyright © 2011-2022 走看看