poj1276
题目链接:http://poj.org/problem?
id=1276
| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 29827 | Accepted: 10733 |
Description
of nk bills. For example,
N=3, n1=10, D1=100, n2=4, D2=50, n3=5, D3=10
means the machine has a supply of 10 bills of @100 each, 4 bills of @50 each, and 5 bills of @10 each.
Call cash the requested amount of cash the machine should deliver and write a program that computes the maximum amount of cash less than or equal to cash that can be effectively delivered according to the available bill supply of the machine.
Notes:
@ is the symbol of the currency delivered by the machine. For instance, @ may stand for dollar, euro, pound etc.
Input
cash N n1 D1 n2 D2 ... nN DN
where 0 <= cash <= 100000 is the amount of cash requested, 0 <=N <= 10 is the number of bill denominations and 0 <= nk <= 1000 is the number of available bills for the Dk denomination, 1 <= Dk <= 1000, k=1,N. White spaces can occur freely between the numbers
in the input. The input data are correct.
Output
Sample Input
735 3 4 125 6 5 3 350
633 4 500 30 6 100 1 5 0 1
735 0
0 3 10 100 10 50 10 10
Sample Output
735
630
0
0
Hint
In the second case the bill supply of the machine does not fit the exact amount of cash requested. The maximum cash that can be delivered is @630. Notice that there can be several possibilities to combine the bills in the machine for matching the delivered
cash.
In the third case the machine is empty and no cash is delivered. In the fourth case the amount of cash requested is @0 and, therefore, the machine delivers no cash.
Source
#include <iostream>
#include <cstdio>
#include <cstring>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
#define ll long long
const double eps = 1e-6;
const double pi = acos(-1.0);
const int INF = 0x3f3f3f3f;
const int MOD = 1000000007; int dp[100005];
int V,n,k[1005],w[1005]; int main ()
{
while (scanf ("%d",&V)==1)
{
scanf ("%d",&n);
for (int i=1; i<=n; i++)
scanf ("%d%d",&k[i],&w[i]);
memset(dp, 0, sizeof(dp));
if (!V||!n){printf ("0\n");continue;}
int maxx=0;dp[0]=1;
for (int i=1; i<=n; i++)
{
for (int j=maxx; j>=0; j--)
{
if (dp[j])
{
for (int l=1; l<=k[i]; l++)
{
if (j+l*w[i]>V) continue;
dp[j+l*w[i]]=1;
if (maxx<j+l*w[i]) maxx=j+l*w[i];
}
}
}
}
printf ("%d\n",maxx);
}
return 0;
}
760ms暴力过的。另附上某大神二进制优化代码。76msAC。
#include<cstdio>
#include<cstring>
#define Max(a, b) a>b?a:b
int dp[100005] ;
int val[105] ;
int main()
{
int cash, n, v, g, i, j, count ;
while(~scanf("%d%d", &cash, &n))
{
if(!cash||!n)
{
while(n--)
scanf("%d%d", &g, &v) ;
printf("0\n") ;
continue ;
}
count = 0 ;
memset(dp, 0, sizeof(dp)) ;
while(n--)
{
scanf("%d%d", &g, &v) ;
//二进制优化
i = 1 ;
while(g>=i)
{
val[count++] = i * v ;
g -= i ;
i *= 2 ;
}
if(g) val[count++] = v * g ;
}
//01背包求解
for(i=0; i<count; i++)
{
for(j=cash; j>=val[i]; j--)
{
dp[j] = Max(dp[j], dp[j-val[i]]+val[i]) ;
}
}
printf("%d\n", dp[cash]) ;
}
return 0 ;
}
poj1276的更多相关文章
- POJ-1276 Cash Machine 多重背包 二进制优化
题目链接:https://cn.vjudge.net/problem/POJ-1276 题意 懒得写了自己去看好了,困了赶紧写完这个回宿舍睡觉,明早还要考试. 思路 多重背包的二进制优化. 思路是将n ...
- poj1276 多重背包
//Accepted 1100 KB 47 ms //多重背包 #include <cstdio> #include <cstring> #include <iostre ...
- POJ1276 - Cash Machine(多重背包)
题目大意 给定一个容量为M的背包以及n种物品,每种物品有一个体积和数量,要求你用这些物品尽量的装满背包 题解 就是多重背包~~~~用二进制优化了一下,就是把每种物品的数量cnt拆成由几个数组成,1,2 ...
- POJ1276:Cash Machine(多重背包)
Description A Bank plans to install a machine for cash withdrawal. The machine is able to deliver ap ...
- dp之多重背包poj1276
题意:有现今cash,和n种钱币,每种钱币有ni个,价值为di,求各种钱币组成的不超过cash的最大钱数....... 思路:二进制拆分转化为01背包,或者转化为完全背包都是可以的. 反思:这个题目我 ...
- POJ1276:Cash Machine(多重背包)
题目:http://poj.org/problem?id=1276 多重背包模板题,没什么好说的,但是必须利用二进制的思想来求,否则会超时,二进制的思想在之前的博客了有介绍,在这里就不多说了. #in ...
- 【个人训练】(POJ1276)Cash Machine
最近的很多题解应该都是dp相关的了,emmm因为dp对我而言思考难度比较大,那么为了理顺自己的思路当然只能通过写blog整理了.愿我能成功搞定dp这个大关!(至少中等难度的dp要能够解决啊o(TヘTo ...
- 【POJ1276】Cash Machine(多重背包单调队列优化)
大神博客转载http://www.cppblog.com/MatoNo1/archive/2011/07/05/150231.aspx多重背包的单调队列初中就知道了但一直没(不会)写二进制优化初中就写 ...
- POJ1276【多重背包】
题意: 给出一个价值sum,然后给出n,代表n个方案,接着n对代表个数与价值,要求最接近sum,但不超过sum的价值. 思路: 多重背包,利用二进制拆分达到保证对于0..n间的每一个整数,均可以用若干 ...
随机推荐
- java double类型保留两位小数4种方法
http://blog.csdn.net/huaishuming/article/details/17752365 ****************************************** ...
- js实现类似qq表情(插入图片以及获取光标的效果)
<!doctype html><html style="height:100%"><head><meta charset="ut ...
- Leetcode:Edit Distance 解题报告
Edit Distance Given two words word1 and word2, find the minimum number of steps required to convert ...
- SQL 分页 SQL SERVER 2008
public IList<UserInfo> GetPageList(int pageSize, int pageIndex, out int totalItemCount) { var ...
- jQuery 学习笔记1 弹出一个对话框
这里推荐使用sublime text 2来写,外加zen coding. 首先是写html 只需要html:xt,然后tab就可以得到一个html的完整结构. <!DOCTYPE html PU ...
- 基于animation.css实现动画旋转特效
分享一款基于animation.css实现动画旋转特效.这是一款基于CSS3实现的酷炫的动画旋转特效代码.效果图如下: 在线预览 源码下载 实现的代码. html代码: <div class ...
- 【转】 oracle 层次查询判断叶子和根节点
Oracle 9i判断是叶子或根节点,是比较麻烦的一件事情,SQL演示脚本如下: DROP TABLE idb_hierarchical; create TABLE idb_hierarchical ...
- HDFS只支持文件append操作, 而依赖HDFS的HBase如何完成增删改查功能
其实HBase/LevelDB等系统,背后都应用了Log-structured merge tree.HBase的写操作有两个步骤:1) 写入HLog(防止宕机丢失数据), 2) 写入对应的Memst ...
- iOS five years[转]
原文链接:http://blog.ayaka.me/post/127980091987/5-years This morning, I got a push notification from Tim ...
- u-boot2011.09 u-boot.img 的流程跟踪
一.主要是start.S 里面的 board_init_f 以及 board_init_r 函数分析,MLO与 u-boot.omg 的区别就在这里 二. MLO 加载完毕,他会重新回到 start. ...