HDU 5410 CRB and His Birthday(完全背包变形)
CRB and His Birthday
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 430 Accepted Submission(s): 237
She went to the nearest shop with M Won(currency unit).
At the shop, there are N kinds of presents.
It costs Wi Won to buy one present of i-th kind. (So it costs k × Wi Won to buy k of them.)
But as the counter of the shop is her friend, the counter will give Ai × x + Bi candies if she buys x(x>0) presents of i-th kind.
She wants to receive maximum candies. Your task is to help her.
1 ≤ T ≤ 20
1 ≤ M ≤ 2000
1 ≤ N ≤ 1000
0 ≤ Ai, Bi ≤ 2000
1 ≤ Wi ≤ 2000
The first line contains two integers M and N.
Then N lines follow, i-th line contains three space separated integers Wi, Ai and Bi.
100 2
10 2 1
20 1 1
CRB's mom buys 10 presents of first kind, and receives 2 × 10 + 1 = 21 candies.
#include<stdio.h>
#include<string.h>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
#define N 2005
#define M 12 int n,m;
int f[N],w[N],a[N],b[N]; int main()
{
int T;cin>>T;
while(T--)
{
scanf("%d%d",&m,&n);
for(int i=;i<=n;i++)
scanf("%d%d%d",&w[i],&a[i],&b[i]); memset(f,,sizeof(f)); for(int i=;i<=n;i++)
{
for(int j=m;j>=w[i];j--)
{
f[j]=max(f[j],f[j-w[i]]+a[i]+b[i]);
}
for(int j=w[i];j<=m;j++)
{
f[j]=max(f[j],f[j-w[i]]+a[i]);
} }
cout<<f[m]<<endl;
}
return ;
}
2. 完全背包的思路。每次有三种选择方案,1不选第i件物品,2选一个第2件物品,3选2个以上的第二件物品。
用一个辅助数组g记录上一行(上一个i)的最大糖果数的值,因为完全背包空间是从小到大的,所以同一个i后面的空间会用到前面的的值,这也就是完全背包的内涵,但是用了辅助数组g,记录上一行的状态,就保证使用a+b不会用到前面的值。
转移方程:f[j]=max3(f[j], f[j-w[i]]+a[i], g[j-w[i]]+a[i]+b[i]);
#include<stdio.h>
#include<string.h>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
#define N 2005
#define M 12 int n,m;
int w[N],a[N],b[N];
int f[N];//f[j]表示j元钱可以得到的最大糖果数
int g[N];//g[j]表示上一个i,j元可以得到的最大糖果数 int max3(int a,int b,int c)
{
return max(a,max(b,c));
} int main()
{
int T;cin>>T;
while(T--)
{
scanf("%d%d",&m,&n);
for(int i=;i<=n;i++)
scanf("%d%d%d",&w[i],&a[i],&b[i]); memset(f,,sizeof(f));
memset(g,,sizeof(g)); for(int i=;i<=n;i++)
{
for(int j=w[i];j<=m;j++)
{
f[j]=max3(f[j], f[j-w[i]]+a[i], g[j-w[i]]+a[i]+b[i]);
}
for(int j=;j<=m;j++)
{
g[j]=f[j];
}
}
cout<<f[m]<<endl;
}
return ;
}
3. 还是完全背包的思路,用dp[i][j][0]表示不取第i件物品,花费j得到的最大收益,dp[i][j][1]表示取第i件物品,花费j得到的最大收益,最终的结果就是max(dp[i][j][0],dp[i][j][1])。每次对于物品i,先得出不取它能得到的最大收益,然后再求取它能得到的最大收益。
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std; const int N = ;
int dp[N][N][]; int main ()
{
int t;cin>>t;
while ( t-- )
{
int m, n;
scanf("%d%d", &m, &n);
memset( dp, , sizeof(dp) );
for ( int i = ; i <= n; i++ )
{
int w, a, b;
scanf("%d%d%d", &w, &a, &b);
for ( int j = ; j <= m; j++ )
{
dp[i][j][] = max( dp[i-][j][], dp[i-][j][] );
}
for ( int j = w; j <= m; j++ )
{
dp[i][j][] = max( dp[i][j - w][] + a, dp[i][j - w][] + a + b );
}
}
printf("%d\n", max( dp[n][m][], dp[n][m][] ));
}
return ;
}
第一位空间可以压缩,把声明改成 int dp[N][2];最后结果改成max(dp[m][0],dp[m][1]).
中间关键代码换成
for ( int j = ; j <= m; j++ )
{
dp[i][j][] = max( dp[i-][j][], dp[i-][j][] );
}
for ( int j = w; j <= m; j++ )
{
dp[i][j][] = max( dp[i][j - w][] + a, dp[i][j - w][] + a + b );
}
HDU 5410 CRB and His Birthday(完全背包变形)的更多相关文章
- hdu 5410 CRB and His Birthday(混合背包)
Problem Description Today is CRB's birthday. His mom decided to buy many presents for her lovely son ...
- hdu 5410 CRB and His Birthday 01背包和全然背包
#include<stdio.h> #include<string.h> #include<vector> #include<queue> #inclu ...
- HDU 5410 CRB and His Birthday ——(完全背包变形)
对于每个物品,如果购买,价值为A[i]*x+B[i]的背包问题. 先写了一发是WA的= =.代码如下: #include <stdio.h> #include <algorithm& ...
- HDU 5410 CRB and His Birthday (01背包,完全背包,混合)
题意:有n种商品,每种商品中有a个糖果,如果买这种商品就送多b个糖果,只有第一次买的时候才送.现在有m元,最多能买多少糖果? 思路:第一次买一种商品时有送糖果,对这一次进行一次01背包,也就是只能买一 ...
- HDU 5410 CRB and His Birthday
题目大意: 一个人要去买礼物,有M元.有N种礼物,每件礼物的价值是Wi, 你第i件礼物买k个 是可以得到 Ai * k + Bi 个糖果的. 问怎么才能使得你得到的糖果数目最多. 其实就是完全背包 ...
- HDU 5410(2015多校10)-CRB and His Birthday(全然背包)
题目地址:HDU 5410 题意:有M元钱,N种礼物,若第i种礼物买x件的话.会有Ai*x+Bi颗糖果,现给出每种礼物的单位价格.Ai值与Bi值.问最多能拿到多少颗糖果. 思路:全然背包问题. dp[ ...
- HDU 2159 FATE(二维费用背包)
FATE Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- HDU 1712 ACboy needs your help(包背包)
HDU 1712 ACboy needs your help(包背包) pid=1712">http://acm.hdu.edu.cn/showproblem.php? pid=171 ...
- HDU 2639 Bone Collector II(01背包变形【第K大最优解】)
Bone Collector II Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
随机推荐
- Sublime Text 2 中文 GBK 规范的配置 暨 解决中文乱码问题 简述
首先通过 Package Control 安装 ConverToUTF8 插件,但是每次新建一个文本后并不是默认使用 GBK,要设置默认使用 GBK,请继续看,然后我们 Ctrl + O 打开文件,在 ...
- Android 开发错误信息001
Error:Execution failed for task ':app:dexDebug'. > com.android.ide.common.process.ProcessExceptio ...
- JAVA 编码中文简述
中文编码问题虽然是个老问题,但对不熟悉的人来说还是不好处理的.不过Java中已经有了一套比较成熟的解决方案. 首先对中文编码格式予以简单介绍:中文编码有三套国标:GB2312,GBK,GB18030, ...
- Oracle学习系列1-7
Oracle学习系列1 两个服务必须启动: OracleOraDb10g*TNListener 和 OracleService*** 使用sqlplusw先进行环境的设置 set linesize 3 ...
- open Live Writer配置步骤
一.关于 Open Live Writer 微软推出的一款能够免费使用的博客写作软件,主要为用户提供博客在线撰写和编辑功能,可以离线编辑,联网时同步到各大博客网站上去. 接下来,介绍如何使用这款工具发 ...
- 我的STL之旅 MyList
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> // ...
- (转)Let’s make a DQN 系列
Let's make a DQN 系列 Let's make a DQN: Theory September 27, 2016DQN This article is part of series Le ...
- JSBinding / Memory Management (GC)
C# and JavaScript both have Garbage Collection (GC). They should not conflict with each other. Class ...
- server.transfer 用法
server.transfer 特点: 1:大家熟悉的一个特点,用server.transfer 跳转到新页面时,浏览器的地址是没有改变的(因为重定向完全在服务器端进行,浏览器根本不知道服务器已经执行 ...
- Yii2.0中文开发向导——Yii2中多表关联查询(join、joinwith)
我们用实例来说明这一部分 表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer (id customer_name) 订单表Order (id order_ ...