背包问题

来源:互联网 发布:acca知乎 编辑:程序博客网 时间:2024/05/17 04:33

思想:

首先找到一个最大值进行比较,然后依次循环遍历:

void main(int argc, char* argv[])
{

    int k,w,v;
    printf("物品的中枢:");
    scanf("%d",&n);
    for(totv=0,k=0;k<n;k++)
    {
        printf("\n第%d种物品的质量和价值:",k+1);
        scanf("%d%d",&w,&v);
        a[k].weight=w;
        a[k].value=v;
        totv=totv+v;
    }
    printf("\n背包的总重量:");
    scanf("%d",&limitw);
    maxv=0;
    for(k=0;k<n;k++)
    {
        cop[k]=0;
    }
    find(0,0,totv);
    printf("\n最佳的方案为:");
    for(k=0;k<n;k++)
    {
        if(option[k])
        {
            printf("\n第%d物品\n",k+1);
        }
        printf("\n总价值为%d",maxv);
    }
}

这个main函数用于进行输入你的背包中的种类及各物品的价值和质量等信息。

通过main函数我们发现只写了一个查找最优化find()函数!

给totv进行了一个赋值操作,就是输入的背包种类的总重量。

下面是find()函数的编写:

#include <stdio.h>
#define N 100
int limitw,totv,maxv;
int option[N],cop[N];
int n;
struct bag
{
    int weight;
    int value;
}a[N];

这里只是进行了一个声明,背包数组最大100个,因为我们在main函数中,及一些变量的声明!

void find(int i,int tw,int tv)
{
    int k;
    if(tw+a[i].weight<=limitw)
    {
        cop[i]=1;
        if(i<n-1)
        {
            find(i+1,tw+a[i].weight,tw);
        }
        else
        {
            for(k=0;k<n;k++)
            {
                option[k]=cop[k];
                maxv=tv;
            }
            cop[i]=0;
        }
    }//这个if条件作用是去寻找maxv的值。
    if(tv-a[i].value>maxv)
        {
            if(i<n-1)
            {
                find(i+1,tw,tv-a[i].value);
            }
            else
            {
                for(k=0;k<n;k++)
                {
                    option[k]=cop[k];
                    maxv=tv-a[i].value;
                }
            }
        }
    }
写到后面发现这代码有点问题,揣摩了几下,发现貌似只能是比背包总数量少一个的情况!大神可以指点下!

0 0
原创粉丝点击