题目描述:

为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,现在假设你一共有资金n元,而市场有m种大米,每种大米都是袋装产品,其价格不等,并且只能整袋购买。请问:你用有限的资金最多能采购多少公斤粮食呢?

输入:

输入数据首先包含一个正整数C,表示有C组测试用例,每组测试用例的第一行是两个整数n和m(1<=n<=100, 1<=m<=100),分别表示经费的金额和大米的种类,然后是m行数据,每行包含3个数p,h和c(1<=p<=20,1<=h<=200,1<=c<=20),分别表示每袋的价格、每袋的重量以及对应种类大米的袋数。

输出:

对于每组测试数据,请输出能够购买大米的最多重量,你可以假设经费买不光所有的大米,并且经费你可以不用完。每个实例的输出占一行。

样例输入:
1
8 2
2 100 4
4 100 2
样例输出:
400

以前总想接触一下多重背包问题,今天终于遇到了。
这是一个多重背包问题,简单来讲,就是每个重量的物品不是只有一个,也不是无限个,而是有限数量个
一开始的思路是转换成普通的背包问题来解决,也就是把每类物品当成是一个个的物品
代码如下
 #include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
int n,m;
int p[];
int w[];
int c[];
int dp[]; int main(int argc, char const *argv[])
{
int C;
//freopen("input.txt","r",stdin);
while(scanf("%d",&C) != EOF) {
while(C--) {
scanf("%d %d",&n,&m);
for(int i = ; i < m; i++) {
scanf("%d %d %d",&p[i],&w[i],&c[i]);
}
memset(dp, , sizeof(dp));
for(int i = ; i < m; i++) {
for(int j = ; j <= c[i]; j++) {
for(int k = n; k >= p[i]; k--) {
dp[k] = max(dp[k],dp[k-p[i]]+w[i]);
}
} }
printf("%d\n",dp[n]);
}
}
return ;
}

当然,这个问题还有一些巧妙的解决技巧

比如一件物品有6件,我们假如把它分成1 + 2 +3 件,你会发现,用1,2,3可以凑出任意一个1到6的数

这样的拆分方法是把一个数拆分成2的幂次方的和,如果不能整拆,则最后一个数为差

譬如10可以拆分成1 +2 + 4 +        3

那么我们可以用这些数去构成相应价值的物品

代码如下:

 #include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
int n,m;
int p[];
int w[];
int c[];
int dp[]; int main(int argc, char const *argv[])
{
int C;
//freopen("input.txt","r",stdin);
while(scanf("%d",&C) != EOF) {
while(C--) {
scanf("%d %d",&n,&m);
int cnt = ;
for(int i = ; i < m; i++) {
int pt,wt,ct;
scanf("%d %d %d",&pt,&wt,&ct);
int c = ;
while(ct - c > ) {
p[cnt] = c * pt;
w[cnt] = c * wt;
ct = ct - c;
cnt++;
c *= ;
}
p[cnt] = ct*pt;
w[cnt] = ct*wt;
cnt++;
}
memset(dp, , sizeof(dp));
for(int i = ; i < cnt; i++) {
for(int k = n; k >= p[i]; k--) {
dp[k] = max(dp[k],dp[k-p[i]]+w[i]);
} }
printf("%d\n",dp[n]);
}
}
return ;
}

九度oj 题目1455:珍惜现在,感恩生活的更多相关文章

  1. 九度OJ 题目1384:二维数组中的查找

    /********************************* * 日期:2013-10-11 * 作者:SJF0115 * 题号: 九度OJ 题目1384:二维数组中的查找 * 来源:http ...

  2. hdu 1284 关于钱币兑换的一系列问题 九度oj 题目1408:吃豆机器人

    钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  3. 九度oj题目&amp;吉大考研11年机试题全解

    九度oj题目(吉大考研11年机试题全解) 吉大考研机试2011年题目: 题目一(jobdu1105:字符串的反码).    http://ac.jobdu.com/problem.php?pid=11 ...

  4. 九度oj 题目1007:奥运排序问题

    九度oj 题目1007:奥运排序问题   恢复 题目描述: 按要求,给国家进行排名. 输入:                        有多组数据. 第一行给出国家数N,要求排名的国家数M,国家号 ...

  5. 九度oj 题目1087:约数的个数

    题目链接:http://ac.jobdu.com/problem.php?pid=1087 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1 ...

  6. 九度OJ题目1105:字符串的反码

    tips:scanf,cin输入字符串遇到空格就停止,所以想输入一行字符并保留最后的"\0"还是用gets()函数比较好,九度OJ真操蛋,true?没有这个关键字,还是用1吧,还是 ...

  7. 九度oj题目1009:二叉搜索树

    题目描述: 判断两序列是否为同一二叉搜索树序列 输入:                        开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束. 接 ...

  8. 九度oj题目1002:Grading

    //不是说C语言就是C++的子集么,为毛printf在九度OJ上不能通过编译,abs还不支持参数为整型的abs()重载 //C++比较正确的做法是#include<cmath.h>,cou ...

  9. 九度OJ题目1003:A+B

    while(cin>>str1>>str2)就行了,多简单,不得不吐槽,九度的OJ真奇葩 题目描述: 给定两个整数A和B,其表示形式是:从个位开始,每三位数用逗号", ...

随机推荐

  1. SharePoint Server 2016 WEB 网站浏览器支持

    SharePoint Server 2016支持多种常用的Web浏览器,如Internet Explorer,Google Chrome,Mozilla Firefox,Apple Safari和Mi ...

  2. Jenkins中启动从节点时,出现问题如何解决,问题:No Known Hosts...

    Jenkins中,启动从节点时,出现如下问题如何解决:/root/.ssh/known_hosts [SSH] No Known Hosts file was found at /root/.ssh/ ...

  3. JavaScript_6_函数

    函数是由事件驱动的或者当它被调用执行的可重复使用的代码块 调用带参数的函数 带有返回值的函数 <!DOCTYPE html> <html> <head> <t ...

  4. Memcache使用基础

    Memcached的特点:     协议简单     基于libevent的事件处理     内置内存存储方式     memcached不互相通信的分布式   1.协议简单:     使用简单的基于 ...

  5. java static block

    java 中 静态块的作用 (一)java 静态代码块 静态方法区别一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在 ...

  6. redis的一个bug

    清楚redis缓存的时候,出现以下问题: (error) MISCONF Redis is configured to save RDB snapshots, but is currently not ...

  7. vs2005无法附加到进程 系统找不到文件

    用管理员身份打开vs2005. 注意配置.

  8. 2829: 高精A+B [1*+]

    题目描述 输入A和B,计算A+B的值 Input 两行数据,分别是A和B 0<=A<=1E200 0<=B<=10^200 Output A+B的结果 Sample Input ...

  9. pandas关联mysql并读写数据库

    1.代码读写mysql,必须安装关联mysql的工具 操作如下命令: sudo apt-get install mysql-server mysql-clientsudo apt-get instal ...

  10. redis学习笔记(1)

    最近在学习redis,做了比较详细的学习笔记,分享给大家,欢迎一起讨论和学习 第一部分,简单介绍redis 和 redis的基本操作 NoSQL的特点 : 数据库种类繁多,但是一个共同的特点都是去掉关 ...