首页 » 网站建设 » 背包php技巧_中级篇背包问题

背包php技巧_中级篇背包问题

访客 2024-11-19 0

扫一扫用手机浏览

文章目录 [+]

背包问题分三类:1.01背包:每件物品仅一件,可以不将背包装满(要么取0件要么1件)

2.完备背包:每件物品无限件,可以不将背包装满。

背包php技巧_中级篇背包问题

3.多重背包:每件物品可一定数量件,可不将背包装满。

背包php技巧_中级篇背包问题
(图片来自网络侵删)

此片详解01背包。

建一个N(M+1)的数组dp[N][M],物品从第一个开始遍历依次装入背包。

关键公式:dp [ i ] [ j ] = max / min ( dp [ i - 1 ] [ j ] , dp[ i - 1 ] [ j - W[ i ] ] + V [ i ] ) ;

典例:http://acm.hdu.edu.cn/showproblem.PHP?pid=2602

题意:可理解为背包问题,一共n样物品各有其重量w[ i ]和代价v[ i ],给出背原谅量m求出背包所容最大的代价。

剖析:每件物品放入或不放入背包,若不放入背包,则dp[ i ] [ j ]的值即为dp[ i - 1 ] [ j ]。
若是放入背包,则须要在当重量为 j - w[ i ] 的根本上加入物品 i,代价也应是在dp[ i ] [ j - w [ i ] ] 的值上再加上物品 i 的代价v [ i ] ,其代价即为dp[ i - 1 ] [ j - w[ i ] ]+ v[ i ] 。
再取两个之中的较大者即得到最优解。

代码实现:

#include <iostream>

#include <string.h>

#include <stdio.h>

#include <algorithm>

#include <math.h>

using namespace std;

int w[1005],v[1005],dp[1005][1005];

int main()

{

int T,n,m;

cin>>T;

while(T--)

{

cin>>n>>m;

//把稳先输入代价!
由于这个WA好几次

for(int i=1;i<=n;i++)

cin>>v[i];

for(int i=1;i<=n;i++)

cin>>w[i];

memset(dp,0,sizeof(dp));//dp数组初始化

for(int i=1;i<=n;i++) //物品从第一个开始遍历

{

for(int j=0;j<=m;j++)//质量从0开始,数据有重量为0,代价不为零的情形

{

//能装下w[i]时,比较dp[i-1][j]和dp[i-1][j-w[i]]+v[i]

if(w[i]<=j) {dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]);}

//装不下则dp[i][j]=dp[i-1][j]

else dp[i][j]=dp[i-1][j];

}

}

cout<<dp[n][m]<<endl;

}

return 0;

}

干系例题:hdu 1203 2159 2955 1171 2191

关于背包问题还会连续连载几篇,希望各位读者连续关注,有条件的话帮小编转发一下吧~

标签:

相关文章

php为无色透明技巧_水货钻石其实也还行

从各种钻石中,可以看到大大小小的“包裹体” 图片来源:参考文献包裹体的种类多样。比钻石形成更早的包裹体,叫“原生包裹体”;与钻石同...

网站建设 2024-12-19 阅读0 评论0

phpstudy发送gbk技巧_php的文件上传

这里首先声明一下这一章的内容比较多,比较难,你要抱着和自己去世磕的态度。细微之处不放过,多敲多练是王道。 学习就像爬山,得一步一步...

网站建设 2024-12-19 阅读0 评论0