题目链接

http://acm.split.hdu.edu.cn/showproblem.php?pid=5410

Problem Description
Today is CRB's birthday. His mom decided to buy many presents for her lovely son.
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
 
Input
There are multiple test cases. The first line of input contains an integer T, indicating the number of test cases. For each test case:
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.
 
Output
For each test case, output the maximum candies she can gain.
 
 
Sample Input
1
100 2
10 2 1
20 1 1
 
Sample Output
21
 
Hint

CRB's mom buys 10 presents of first kind, and receives 2 × 10 + 1 = 21 candies.

 
Author
KUT(DPRK)
 
Source
 
Recommend
wange2014
 
题意:输入M,N,分别表示总的钱数和物品种数,接下来输入N行,每行3个数,单价、买一件送的糖数 、买一次送的糖数   求最多能得到多少糖?
 
思路:01背包,dp[i]表示i钱下能得到最多的糖数,vis[i][j]表示i钱下得到最多糖时,是否买j物品,状态转移方程dp[i]=dp[i-kind[j][0]]+kind[j][1]+(vis[i-kind[j][0]][j]==0) * kind[j][2];
 
代码如下:
 
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
#define eps 1e-8
#define maxn 105
#define inf 0x3f3f3f3f3f3f3f3f
#define IN freopen("in.txt","r",stdin);
using namespace std;
int dp[];
int vis[][];
int kind[][]; int main()
{
int T;
int M,N;
cin>>T;
while(T--)
{
scanf("%d%d",&M,&N);
for(int i=;i<N;i++)
scanf("%d%d%d",&kind[i][],&kind[i][],&kind[i][]);
memset(dp,,sizeof(dp));
memset(vis,,sizeof(vis)); for(int i=;i<=M;i++)
{
int flag=-;
for(int j=;j<N;j++)
{
if(i<kind[j][]) continue;
int s=dp[i-kind[j][]]+kind[j][];
if(!vis[i-kind[j][]][j]) s+=kind[j][];
if(dp[i]<s)
{
dp[i]=s;
flag=j;
}
}
if(flag>=)
{
for(int j=;j<N;j++)
{
vis[i][j]=vis[i-kind[flag][]][j];
}
vis[i][flag]++;
}
}
int tmp=;
for(int i=;i<=M;i++)
tmp=max(tmp,dp[i]);
printf("%d\n",tmp);
}
return ;
}

最新文章

  1. JS中函数声明与函数表达式的不同
  2. C# 同步/并发队列ConcurrentQueue
  3. maven学习(二)
  4. OSChina 的全文搜索设计说明 —— 索引过程
  5. 蓝牙4.0 BLE 开发
  6. Codeforces 571B Minimization
  7. 杭电2059(dp)
  8. java匿名内部类,多态,接口练习
  9. 关联A850刷机包 高级电源 时间中心 优化 ROOT 动力 美化 简化
  10. Selenium 新窗口处理方法
  11. memcache的原理和命中率的总结
  12. TCP/IP(二)物理层详解
  13. JAVA基础面试(五)
  14. BZOJ 1492: [NOI2007]货币兑换Cash [CDQ分治 斜率优化DP]
  15. 为eclipse安装subclipse(SVN插件)
  16. linux运行python程序
  17. python3 词法拆分
  18. 寒假生活第一天——Github初体验
  19. Dell R730服务器 Raid5配置
  20. IdentityServer4之Clients、Scopes、Claims与Token关联

热门文章

  1. Atitti knn实现的具体四个距离算法 欧氏距离、余弦距离、汉明距离、曼哈顿距离
  2. iOS—网络实用技术OC篇&amp;网络爬虫-使用java语言抓取网络数据
  3. 转:Acegi Security
  4. Java EE开发平台随手记4——Mybatis扩展3
  5. Java中的数是用补码表示的检验
  6. AJAX文件上传实践与分析,带HTML5文件上传API。
  7. CentOS6.5使用createrepo搭建本地源
  8. .NET面试题解析(01)-值类型与引用类型
  9. Spring(一)第一个示例
  10. CSS3入门之转换