• 动态规划之0-1背包问题


    0-1 背包问题是动态规划中一个典型的问题。

    问题描述

    给定n种物品和一个背包,物品 i 价值 wi 和重量 vi 已知,确定装入背包的物品方案,使得包内物品总价值最大。

    算法过程

    设n个物品重量存储在w[n]中,价值存储在数组v[n]中,背包容量位C,数组V[n+1][C+1]存放迭代结果,其中V[i][j]表示前i个物品装入容量为j的背包中获得的最大价值,数组x[n]存储装入背包的物品,动态规划求解过程如下:

    代码实现

    因为所有数据都是在程序运行后输入的,所以需要动态数组来存储。这里使用指针来实现动态数组。

     1 #include <stdio.h>
     2 
     3 int KnapSack(int n,int w[],int v[]);
     4 
     5 int *w, *v, n, C;
     6 
     7 int main()
     8 {
     9     int i;
    10     printf_s("请输入背包容量:");
    11     scanf_s("%d", &C);
    12     printf_s("请输入物品个数:");
    13     scanf_s("%d", &n);
    14 
    15     w = new int [n];
    16     printf("请输入物品重量:");
    17     for(i = 0; i < n; i++)
    18         scanf_s("%d", &w[i]);
    19 
    20     v = new int [n];
    21     printf("请输入物品价值:");
    22     for(i = 0; i < n; i++)
    23         scanf_s("%d", &v[i]);
    24 
    25     printf("最优价值:%d", KnapSack(n,w,v));
    26     return 0;
    27 }
    28 
    29 
    30 int KnapSack(int n,int w[],int v[])
    31 {
    32     int i,j;
    33 
    34     int **V = new int*[C+1];
    35     for (i = 0; i < C+1; i++)
    36         V[i] = new int[n+1];
    37 
    38     int *x = new int[n];
    39     for (i = 0; i <= n; i++)
    40         V[i][0] = 0;
    41     for (j = 0; j <= C; j++)
    42         V[0][j] = 0;
    43     for (i = 1; i <= n; i++)
    44         for (j = 1; j <= C; j++)
    45             if(j < w[i-1])
    46                 V[i][j] = V[i-1][j];
    47             else
    48                 V[i][j] = V[i-1][j] >= (V[i-1][j-w[i-1]]+v[i-1]) ? V[i-1][j]: (V[i-1][j-w[i-1]]+v[i-1]);
    49 
    50     j = C;
    51     for (i = n; i > 0; i--)
    52     {
    53         if (V[i][j] > V[i-1][j])
    54         {
    55             x[i-1] = 1;
    56             j = j - w[i-1];
    57         }
    58         else
    59             x[i-1] = 0;
    60     }
    61     return V[n][C];
    62 }

    作者:耑新新,发布于  博客园

    转载请注明出处,欢迎邮件交流:zhuanxinxin@aliyun.com

  • 相关阅读:
    swift基础语法(05- 可选值)
    swift基础语法(03- 运算符)
    swift基础语法(04- 元组)
    swift基础语法(02-基本数据类型)
    tableView的全屏穿透效果的实现
    ScrollView属性解析
    TableView的重要性
    SQLite操作
    openFileOutput的几种文件模式
    保存文件到SDcard
  • 原文地址:https://www.cnblogs.com/Arthurian/p/9079704.html
Copyright © 2020-2023  润新知