思路:将v1,v2,k都当作一种体积,每种物品只能取一次,求max.......

反思:以前写背包,由于只有一个体积,所以习惯性的在for中,就所取的最小值限制,而在这次,因为这里导致wa了,具体是因为在多个体积限制的背包里,当这个体积小于它的最小体积时,它可以不去减它的最小体积,而是作为一种状态来传递其他体积的限制的值........

wa代码:

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int dp[105][105][110],s[105][3];
int max(int x,int y)
{
if(x>y)
return x;
else
return y;
}
int main()
{
int n,v1,v2,k;
while(scanf("%d%d%d%d",&n,&v1,&v2,&k)>0)
{
for(int i=1;i<=n;i++)
scanf("%d%d%d",&s[i][0],&s[i][1],&s[i][2]);
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
for(int j=v1;j>=s[i][0];j--)
{
for(int p=v2;p>=s[i][1];p--)
{
for(int q=k;q>=0;q--)
{
int maxx=0;
if(maxx<dp[j-s[i][0]][p][q]+s[i][2])
maxx=dp[j-s[i][0]][p][q]+s[i][2]; if(maxx<dp[j][p-s[i][1]][q]+s[i][2])
maxx=dp[j][p-s[i][1]][q]+s[i][2]; if(q>0&&maxx<dp[j][p][q-1]+s[i][2])
maxx=dp[j][p][q-1]+s[i][2]; if(maxx<dp[j][p][q])
maxx=dp[j][p][q];
dp[j][p][q]=maxx;
}
}
}
}
printf("%d\n",dp[v1][v2][k]);
}
return 0;
}

ac代码:

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int dp[105][105][110],s[105][3];
int max(int x,int y)
{
if(x>y)
return x;
else
return y;
}
int main()
{
int n,v1,v2,k;
while(scanf("%d%d%d%d",&n,&v1,&v2,&k)>0)
{
for(int i=1;i<=n;i++)
scanf("%d%d%d",&s[i][0],&s[i][1],&s[i][2]);
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
for(int j=v1;j>=0;j--)
{
for(int p=v2;p>=0;p--)
{
for(int q=k;q>=0;q--)
{
int maxx=0;
if(j>=s[i][0]&&maxx<dp[j-s[i][0]][p][q]+s[i][2])
maxx=dp[j-s[i][0]][p][q]+s[i][2]; if(p>=s[i][1]&&maxx<dp[j][p-s[i][1]][q]+s[i][2])
maxx=dp[j][p-s[i][1]][q]+s[i][2]; if(q>0&&maxx<dp[j][p][q-1]+s[i][2])
maxx=dp[j][p][q-1]+s[i][2]; if(maxx<dp[j][p][q])
maxx=dp[j][p][q];
dp[j][p][q]=maxx;
}
}
}
}
printf("%d\n",dp[v1][v2][k]);
}
return 0;
}

dp之多维背包hdu4501的更多相关文章

  1. dp之二维背包poj2576

    题意:有一群sb要拔河,把这群sb分为两拨,两拨sb数只差不能大于1,输出这两拨人的体重,小的在前面...... 思路:把总人数除2,总重量除2,之后你会发现就是个简单的二维背包,有两个限制..... ...

  2. (第三场) A PACM Team 【dp,五维背包】

    链接:https://www.nowcoder.com/acm/contest/141/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...

  3. dp之二维背包poj1837(天平问题 推荐)

    题意:给你c(2<=c<=20)个挂钩,g(2<=g<=20)个砝码,求在将所有砝码(砝码重1~~25)挂到天平(天平长  -15~~15)上,并使得天平平衡的方法数..... ...

  4. dp之多维背包hdu2159

    二维背包问题,我是觉得这个题目数据比较水,虽然它最后说了怪可以无限个,但是它却只能最多杀s个,也就是所有品种的怪最多为s个,那么就是二维完全背包的问题了.......同时,它没有说一定要杀s只怪,所以 ...

  5. dp之二维背包hdu3496

    题意:给你n张电影门票,但一次只可以买m张,并且你最多可以看L分钟,接下来是n场电影,每一场电影a分钟,b价值,要求恰好看m场电影所得到的最大价值,要是看不到m场电影,输出0: 思路:这个题目可以很明 ...

  6. 二维背包(钟神想要的)(不是DP)

    [问题描述] 背包是个好东西,希望我也有.给你一个二维的背包,它的体积是? × ?.现在你有一些大小为1× 2和1×3的物品,每个物品有自己的价值.你希望往背包里面装一些物品,使得它们的价值和最大,问 ...

  7. dp 二维乃至多维背包

    洛谷P1855 榨取kkksc03 分析:套路是很明显的01背包,但是这时受约束的变量有两个了,这种情况下就该用多维背包了 分析方法一样的,用dp[i][j][k]表示从前i个愿望中挑选总时间和总金钱 ...

  8. hdu4501——小明系列故事——买年货(多维背包)

    题解: 思路:将v1,v2,k都当作一种体积,开三维dp数组,每种物品只能取一次 代码中的for循环是倒着进行的,知道01背包和完全背包的肯定明白,倒着进行的就代表每种物品只选择一次 代码: 1 #i ...

  9. hdu 4501 小明系列故事——买年货_二维背包

    题目:你可以有v1元,v2代金券,v3个物品免单,现在有n个商品,商品能用纸币或者代金券购买,当然你可以买v3个商品免费.问怎么最大能买多少价值 题意: 思路二维背包,dp[v1][v2][v3]=M ...

随机推荐

  1. JavaScript实现碰撞检测(分离轴定理)

    概述 分离轴定理是一项用于检测碰撞的算法.其适用范围较广,涵盖检测圆与多边形,多边形与多边形的碰撞:缺点在于无法检测凹多边形的碰撞.本demo使用Js进行算法实现,HTML5 canvas进行渲染. ...

  2. 微信小程序+PHP:动态显示项目倒计时(格式:4天7小时58分钟39秒)

    1.一般我们说的显示秒杀都是指的单条数据,循环我没做. 效果: 2.wxml代码: <p class="endtime_act">距报名截止还有: <block ...

  3. oracle客户端服务端字符集-解决乱码

    查询server段字符集 select userenv('language') from dual 查询client段字符集 select * from v$nls_parameters NLS_LA ...

  4. System.err.println()

    err是运行期异常和错误反馈的输出流的方向 System.err.println只能在屏幕上实现打印,即使你重定向了也一样 用err打印出的 字符串,再eclipse的console会显示成红色 标准 ...

  5. [转]TCP(HTTP)长连接和短连接区别和怎样维护长连接

    原文链接 一.HTTP协议和TCP协议 HTTP的长连接和短连接本质上是TCP长连接和短连接.HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议.IP协议主要解决网络路由和寻址问题, ...

  6. Python atan() 函数

    描述 atan() 返回x的反正切弧度值. 语法 以下是 atan() 方法的语法: import math math.atan(x) 注意:atan()是不能直接访问的,需要导入 math 模块,然 ...

  7. Linux 批量建立信任关系,实现ssh无password登陆的脚本

    作用: 把当前机器的ssh公钥拷贝到其它机器.以实现从当前机器能够ssh无password登陆到其它机器 用法: 1)把要加入的ip地址写入到一个文件里.比方host 2)把脚本保存为sh文件,如 i ...

  8. python标准库介绍——27 random 模块详解

    ==random 模块== "Anyone who considers arithmetical methods of producing random digits is, of cour ...

  9. 如何用Latex合并多个pdf文件?

    如何用Latex合并多个pdf文件?   用TeX合并pdf, 用LaTeX合并pdf 代码: \documentclass[a4paper]{article} \usepackage{pdfpage ...

  10. python 异步编程

    Python 3.5 协程究竟是个啥 Yushneng · Mar 10th, 2016 原文链接 : How the heck does async/await work in Python 3.5 ...