zoukankan      html  css  js  c++  java
  • 背包问题

     1 /*
     2 2015.4  HT
     3 背包问题
     4 f[i][v] : 前i件物品放到一个容量为v的背包中可以获得最大价值
     5 状态转移方程: f[i][v] = max(f[i - 1][v],f[i - 1][v - weight[i]] + cost[i])  
     6 
     7 */
     8 #include <iostream>
     9 using namespace std;
    10 
    11 const int N = 3;//物品个数
    12 const int V = 5;//背包最大容量
    13 int weight[N + 1] = { 0, 3, 2, 2 };
    14 int value[N + 1] = { 0, 5, 10, 30 };
    15 int f[N + 1][V + 1] = { { 0 } };
    16 
    17 int Max(int x, int y)
    18 {
    19     return x > y ? x : y;
    20 }
    21 int Knapsack()
    22 {
    23     memset(f, 0, sizeof(f));
    24     for (int i = 1; i <= N; i++) //枚举物品
    25     {
    26         for (int j = 0; j <= V; j++) //枚举背包容量
    27         {
    28             f[i][j] = f[i - 1][j];   //前i - 1件物品放到容量为v的背包中,带来的收益
    29             if (j >= weight[i])         //可以容下该重量
    30             {
    31                 f[i][j] = Max(f[i - 1][j], f[i - 1][j - weight[i]] + value[i]);
    32             }
    33         }
    34     }
    35     return f[N][V];
    36 }
    37 int main()
    38 {
    39     cout << Knapsack() << endl;
    40     return 0;
    41 }
    http://acm.hdu.edu.cn/showproblem.php?pid=2191
     1 /*
     2 2015.4  HT
     3 换成使用一位数组
     4 http://acm.hdu.edu.cn/showproblem.php?pid=2191
     5 输入数据首先包含一个正整数C,表示有C组测试用例,每组测试用例的第一行是两个整数n和m(1<=n<=100, 1<=m<=100),
     6 分别表示经费的金额和大米的种类,然后是m行数据,每行包含3个数p,h和c(1<=p<=20,1<=h<=200,1<=c<=20),
     7 分别表示每袋的价格、每袋的重量以及对应种类大米的袋数。
     8 
     9 f[v] = max(f[v], f[v-c[i]])相当于我们的转移方程f[i][v] = max(f[i-1][v],f[i-1][v-c[i]])                                                                     
    10 */
    11 
    12 #include <iostream>
    13 #include <string.h>
    14 #include <algorithm>
    15 using namespace std;
    16 #define MAX  20
    17 int value[MAX], weight[MAX],bagnum[MAX], F[MAX];
    18 
    19 int main()
    20 {
    21     int T, nValue, nKind;
    22     cin >> T;
    23     while (T--)
    24     {
    25         memset(F, 0, sizeof(F));
    26         cin >> nValue >> nKind;
    27         for (int i = 0; i < nKind; i++)
    28         {
    29             cin >> value[i] >> weight[i] >> bagnum[i];
    30         }
    31         for (int i = 0; i < nKind; i++)
    32         for (int j = 0; j < bagnum[i]; j++)
    33         for (int k = nValue; k >= value[i]; k--)
    34             F[k] = max(F[k], F[k - value[i]] + weight[i]);
    35         cout << F[nValue] << endl;
    36     }
    37     return 0;
    38 }
    
    
    
    
    
    
  • 相关阅读:
    第二章 课后习题 6
    第二章 课后习题 5
    第一章 课后习题 10
    第一章 课后习题 7
    JAVA练习1
    作业2
    作业
    c++作业10月13日作业
    c++作业50页例题3.1
    for循环作业4和5
  • 原文地址:https://www.cnblogs.com/ht-beyond/p/4392095.html
Copyright © 2011-2022 走看看