01背包

作者: 面包牛奶wlq | 来源:发表于2017-10-08 18:58 被阅读0次

题目:

有N种物品(每种物品只有一件)和一个容量为V的背包。放入第i件物品耗费的费用为Ci,得到的价值是vi,求解将哪些物品装入背包可使得价值总和最大。
状态转移方程:
f[i][j]=max(f[i-1][j - w[i-1]] + v[i-1], f[i-1][j]);

物品信息 状态转移表格(灰色为初始化)

代码一:

#include<malloc.h>
#include<string.h>
int max(int a,int b){          //定义取两个数之间最大数的函数
    return a>b?a:b;
}
int main(){
    int n,i,j,V;
    scanf("%d %d",&n,&V);      //n表示有的商品种类,V表示背包大小
    int *w=(int*)malloc(n*sizeof(int));
    int *v=(int*)malloc(n*sizeof(int));
    for(i=0;i<n;i++){                //输入n个商品的重量/大小
        scanf("%d",&w[i]);
    }
    for(j=0;j<n;j++){
        scanf("%d",&v[j]);    //输入n个商品的价值
    }
    int **f=(int**)malloc((n+1)*sizeof(int*));  //定义一个二维数组保存状态
    for(i=0;i<=n;i++){
        f[i]=(int*)malloc((V+1)*sizeof(int));
    }
    for(i=0;i<=n;i++){
        f[i][0]=0;
    }
    for(i=0;i<=V;i++){
        f[0][i]=0;
    }
    for(i=1;i<=n;i++){
        for(j=1;j<=V;j++){
            if(j>=w[i-1]){
                f[i][j]=max(f[i-1][j - w[i-1]] + v[i-1], f[i-1][j]);  //状态转移方程
            }else{
                 f[i][j] = f[i-1][j];
            }
        }
    }
    for(i=0;i<=n;i++){
        for(j=0;j<=V;j++){
            printf("%d ",f[i][j]);
        }
        printf("\n");
    }
    printf("\n%d\n",f[n][V]);
}

样例输出

输出演示

相关文章

  • 算法模板(一) 01背包,多重背包,完全背包

    01背包 多重背包 完全背包

  • 动态规划-背包问题

    01背包问题 详解:01背包问题详解链接

  • DP小结

    DP种类 线性DP 区间DP 树形DP 背包DP01背包满背包完全背包(转成01背包) 例子:线性动规:拦截导弹,...

  • java算法巩固训练day01

    01背包 完全背包 多重背包 多重背包二进制优化算法

  • 动态规划-混合、二维费用、分组背包

    混合背包 如果将01背包、完全背包、多重背包三个背包混合起来,也就是说,有的物品只可以取一次(01背包),有的物品...

  • 01-背包、完全背包、多重背包及其相关应用

    本文介绍了背包问题系列,主要包括: 【1】 01-背包及其应用【2】完全背包及其应用【3】多重背包 【1】01-背...

  • 01 01背包

  • 01背包

    题目: 有N种物品(每种物品只有一件)和一个容量为V的背包。放入第i件物品耗费的费用为Ci,得到的价值是vi,求解...

  • 01背包

    01背包的问题很早就想写了,但是因为一些意外的事情耽搁了下来今天补习一下01背包问题的计算过程。首先,01背包的问...

  • 01背包

    1. 问题 给定背包承重W,对于n件物品(每件物品重量wi,价值vi),在背包的承重范围内,可以带走的物品价值总和...

网友评论

      本文标题:01背包

      本文链接:https://www.haomeiwen.com/subject/zvlyyxtx.html