zoukankan      html  css  js  c++  java
  • 0-1背包之动态规划(附演示动画)

    0-1背包之C语言

    01背包问题应该算是一个很经典的问题了,接下来实现一下

    问题:
    现给出一个容量为V的背包和N件物品,每件物品的体积为v[i],价值为c[i],将几件物品装入背包内,使得物品总体积不超过背包体积,并且使总价值最大,求这个最大值?
    给出一组数据:
    V = 8,N = 4;
    i 1 2 3 4
    v 2 3 4 5
    c 3 4 5 6

    解题思路:
    f[i][j] 表示前 i 种物品,背包容量为 j 时的最大价值
    首先初始化数组 f[][]
    当 i=1 时,如果背包可以放下第一个物品,则放入,更新最大价值
    基于第一行的结果和背包容量,可以选择选或者不选第二件,取最大价值

    不断更新,直到最后一个值的时候就知道最大价值了
    看下面的图:
    f[i][j] 表示前 i 种物品,背包容量为 j 时的最大价值
    这样就可以明显的看出来了

    状态转移方程

    f[i][j] = max(f[i-1][j],f[i-1][j-v[i]] + c[i])

    在这里插入图片描述
    代码部分

    #include <stdio.h>
    #include <stdlib.h>
    #define maxn 10
    #define maxv 10
    

    int max(int a,int b)
    {
    if(a>b){
    return a;
    }
    else{
    return b;
    }
    }

    int main()
    {
    int N,V,f[maxn][maxv],c[maxn],v[maxn];
    printf("请输入背包总量和物品数量: ");
    scanf("%d %d",&V,&N);
    printf("请依次输入物品体积和价格: ");
    for(int i=1;i <= N;++i)
    scanf("%d %d",&v[i],&c[i]);
    for(int i=1;i <= N;++i)
    for(int j=1;j <= V;++j){
    f[i][j] = f[i-1][j];
    if(j >= v[i])
    f[i][j] = max(f[i-1][j],f[i-1][j-v[i]] + c[i]);
    }
    printf("最大价值:%d ",f[N][V]);
    return 0;
    }

    附件一个讲的不错的视频演示:
    01背包视频演示

  • 相关阅读:
    elasticsearch 数据迁移
    elasticsearch使用简介 -安装篇
    docker 使用笔记
    PHP 全局变量
    做人做事需牢记20条原则
    MYSQL 存储引擎概述
    postgresql常用命令
    ORACLE 清理SYSAUX表空间
    sqlserver数据库的启动
    postgressql启动与关闭
  • 原文地址:https://www.cnblogs.com/Indomite/p/14195230.html
Copyright © 2011-2022 走看看