给定N中物品和一个背包。物品i的重量是Wi,其价值位Vi ,背包的容量为C。问应该如何选择装入背包的物品,使得转入背包的物品的总价值为最大?对每种物品i只有两种选择,即装入背包和不装入背包

来源:互联网 发布:淘宝客佣金结算时间 编辑:程序博客网 时间:2024/05/16 17:55


/*背包问题*/
#include<stdio.h>
int f[101][101];//前i个物品装入容量为j的背包中获得的最大价值
int max(int a,int b)//调用函数选取a,b中最大的数
{
   if(a>=b)
       return a;
   else
    return b;
}
int bag(int n,int c[],int w[],int v)//n为物品种类,w为物品重量,v为物品价值,C为背包容量
{
    int i,j;//i为第i件物品,j为背包此时容量
    for(i=0;i<=n;i++)
        f[i][0]=0;
    for(j=0;j<=v;j++)
        f[0][j]=0;//以上分别为背包容量为0和0个物品时物品价值为0;
    for(i=0;i<=n;i++)
    {
        for(j=0;j<=v;j++)
        {
            if(j<c[i])//如果j此时的容量小于放入第i件物品
            {
                f[i][j]=f[i-1][j];//前i-1物品所产生的价值
            }
            else
            {
                f[i][j]=max(f[i-1][j],f[i-1][j-c[i]]+w[i]);//判断i放进去和不放进去那种取得的价值大然后输出价值大的
            }
        }
    }


        return f[n][v];


}
int main()
{
    int s,c[101],w[101],n,i,v;
    scanf("%d",&v);
    scanf("%d",&n);
    for(i=0;i<n;i++)
        scanf("%d",&c[i]);
    for(i=0;i<n;i++)
        scanf("%d",&w[i]);
    s=bag(n,c,w,v);
    printf("%d\n",s);
}
阅读全文
1 0