背包九讲之五(二维费用的背包问题)

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\n",dp[T][V]);
38     }
39 
40     return 0;
41 }
复制代码

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

posted @   justPassBy  阅读(1997)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
点击右上角即可分享
微信分享提示