首页 > 编程知识 正文

dp,经典背包问题

时间:2023-05-05 01:32:45 阅读:22379 作者:4789

完全背包

时间限制: 3000 ms |内存限制: 65535 KB

难度: 4

说明

直截了当地说,完整背包定义了n种类型的项目和容量为v的背包,每个项目都有无限的项目。 第I项的体积是c,价值是w。 求出哪个物品放入背包,这些物品的体积总和不会超过背包的容量,且价值总和最大。 本问题的要求是求出背包刚好装满时,最大价值的总和是多少。 背包装不牢时,输出NO

输入

第1行: n表示测试数据(N7 )的组有几个。

其次,每个测试数据的第一行有两个整数m、v。 m表示物品种类的数量,v表示背包的总容量。 (0m=2000,0v=50000 )

以下m行每行包含两个整数c,其中w表示每个物品的重量和价值(0. c 100000,0w 100000 )

输出功率

对应各组测试数据输出结果(如果背包正好装满,则输出背包装满时背包内物品最大价值的总和。 如果不能将背包装得很紧,则输出NO )

样本输入

2

1 5

2 2

2 5

2 2

5 1

样本输出

1

问题: http://www.Sina.com/http://www.Sina.com /分别有n个wi、vi的重量和价值,从中选择总重量不超过w的,在所有筛选方案中求出价值总和的最大值

与01背包的区别:个重量和价值分别为wi、vi的物品,从这些物品中选择总重量在w以下的物品,在所有分拣方案中求出价值总和的最大值,对每个物品选择多个,将完整背包改为0.1背包

DP[I][j]=max(DP[I-1][j-k*w[I] ) k * v [ I ] (0=k * w [ I ] (w ) ) ) () ) ) )

一维数组DP [ I ]=转换为max (DP [ j-k * w [ I ] ) k*v[I] ) *

# include bits/stdc.husingnamespacestd; 常数int maxn=100000 5; 结构rec { int c; int w; }vis[maxn]; int n,m,v; 龙龙Dp [ maxn ]; void DP () for ) intI=1; i=m; I ) for(intj=vis[I].c; j=v; j({DP[j]=max(DP[j],dp[j-vis[i].c] vis[i].w ); }if(DP[v]0) cout'NO'endl; else coutdp[v]endl; (}int main ) ) { cinn; wile(n-- ) memset ) DP,-10000,sizeof ) ) DP ); //01背包初始化为0,其中初始化相对较大的负dp[0]=0; cinmv; for(intI=0; im; I ) { cinvis[i].cvis[i].w; (DP ); }返回0; }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。