zoukankan      html  css  js  c++  java
  • 背包九讲之五(二维费用的背包问题)

    http://acm.fafu.edu.cn/problem.php?id=1499

     1 /*
     2 二维费用的背包问题是指:对于每件物品,具有两种不同的费用,
     3 选择这件物品就必须付出这两种代价,每种代价都有可付出的最大值(背包容量)
     4 问怎么选择物品才能得到最大价值.费用增加了一维,那么只需要状态增加一维就可以了、
     5 dp[i][j][k]  前i件物品付出两种代价为j和k的最大价值
     6 dp[i][j][k] = max(dp[i-1][j][k],dp[i-1][j-a[i]][k-b[i]]);
     7 根据背包的思想,可将状态压缩为二维的.
     8 只不过是费用增加了一维,所以01背包,完全背包,多重完全背包的思想完全
     9 可以用在这里
    10 */
    11 #include <stdio.h>
    12 #include <string.h>
    13 int t[111],v[111],g[111];
    14 int dp[1111][111];
    15 int T,V,N;
    16 inline int max(const int &a, const int &b)
    17 {
    18     return a < b ? b : a;
    19 }
    20 void zeroOnePack(int t,int v, int g)
    21 {
    22     int i,j;
    23     for(i=T; i>=t; --i)
    24         for(j=V; j>=v; --j)
    25             dp[i][j] = max(dp[i][j],dp[i-t][j-v]+g);
    26 }
    27 int main()
    28 {
    29     int i;
    30     while(scanf("%d%d%d",&T,&V,&N)!=EOF)
    31     {
    32         memset(dp,0,sizeof(dp));
    33         for(i=1; i<=N; ++i)
    34             scanf("%d%d%d",&g[i],&t[i],&v[i]);
    35         for(i=1; i<=N; ++i)
    36             zeroOnePack(t[i],v[i],g[i]);
    37         printf("%d
    ",dp[T][V]);
    38     }
    39 
    40     return 0;
    41 }

     但是更多的时候是隐式地给出条件,比如n个物品最多取m个,那么第二维的费用便是个数。

  • 相关阅读:
    todo---HttpClient,httpUrlConnection
    todo---callback
    todo-braintree-java
    todo--com.paypal.sdk
    todo--OkHttp基本使用
    @RequestBody 和@ResponseBody 注解详解
    常用Jar包下载
    SpringMVC 使用JSR-303进行校验 @Valid
    SpringMVC 之 表单标签
    SpringMVC 自定义类型转换器
  • 原文地址:https://www.cnblogs.com/justPassBy/p/4279674.html
Copyright © 2011-2022 走看看