dp之多重背包poj1276
题意:有现今cash,和n种钱币,每种钱币有ni个,价值为di,求各种钱币组成的不超过cash的最大钱数.......
思路:二进制拆分转化为01背包,或者转化为完全背包都是可以的。
反思:这个题目我wa两次,是应为我把判断cash==0||n==0放得太前,以致于后面的数据木有输入
wa代码:
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int dp[110000],t[30000],s[2000][2];
int main()
{
int cash,n;
while(scanf("%d%d",&cash,&n)>0)
{
if(cash==0||n==0) //错在这里,放的太前
{
printf("0\n");
continue;
}
int cnt=0;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&s[i][0],&s[i][1]);
int k=1;
while(s[i][0]-k>0)
{
t[cnt++]=k*s[i][1];
s[i][0]-=k;
k*=2;
}
t[cnt++]=s[i][0]*s[i][1];
}
memset(dp,0,sizeof(dp));
for(int i=0;i<cnt;i++)
{
for(int j=cash;j>=t[i];j--)
if(dp[j]<dp[j-t[i]]+t[i])
dp[j]=dp[j-t[i]]+t[i];
}
printf("%d\n",dp[cash]);
}
return 0;
}
ac代码,二进制拆分:
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int dp[110000],t[30000],s[2000][2];
int main()
{
int cash,n;
while(scanf("%d%d",&cash,&n)>0)
{
int cnt=0;
//memset(t,0,sizeof(t));
for(int i=1;i<=n;i++)
{
scanf("%d%d",&s[i][0],&s[i][1]);
int k=1;
if(s[i][0]==0||s[i][1]==0)
continue;
while(s[i][0]-k>0)
{
t[cnt++]=k*s[i][1];
s[i][0]-=k;
k*=2;
}
t[cnt++]=s[i][0]*s[i][1];
}
memset(dp,0,sizeof(dp));
for(int i=0;i<cnt;i++)
{
for(int j=cash;j>=t[i];j--)
if(dp[j]<dp[j-t[i]]+t[i])
dp[j]=dp[j-t[i]]+t[i];
}
printf("%d\n",dp[cash]);
}
return 0;
}
ac代码,转换为完全背包:
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int dp[110000],num[100100],s[2000][2];
int main()
{
int cash,n;
while(scanf("%d%d",&cash,&n)>0)
{
int cnt=0;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&s[i][0],&s[i][1]);
}
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
memset(num,0,sizeof(num));
for(int j=s[i][1];j<=cash;j++)
if(dp[j]<dp[j-s[i][1]]+s[i][1]&&num[j-s[i][1]]<s[i][0])
{
dp[j]=dp[j-s[i][1]]+s[i][1];
num[j]=num[j-s[i][1]]+1;
}
}
printf("%d\n",dp[cash]);
}
return 0;
}
dp之多重背包poj1276的更多相关文章
- 单调队列优化DP,多重背包
单调队列优化DP:http://www.cnblogs.com/ka200812/archive/2012/07/11/2585950.html 单调队列优化多重背包:http://blog.csdn ...
- dp之多重背包poj2392
题意:有k种石头,高为hi,在不超过ai的高度下,这种石头可以放置,有ci种这个石头,求这些石头所能放置的最高高度......... 思路:以往的什么硬币种数,最大硬币数之类的,他们的硬币都已经是排好 ...
- dp之多重背包hdu1059
题意:价值为1,2,3,4,5,6. 分别有n[1],n[2],n[3],n[4],n[5],n[6]个.求能否找到满足价值刚好是所有的一半的方案. 思路:简单的多重背包,我建议多重背包都用二进制拆分 ...
- nyoj 546——Divideing Jewels——————【dp、多重背包板子题】
Divideing Jewels 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 Mary and Rose own a collection of jewells. ...
- dp之多重背包(二进制优化)
void solve(int v,int w,int c){ int count=0; for(int k=1;k<=c;k<<=1) { val[c ...
- 硬币问题 (dp,多重背包的二分优化)
题目描述 给你n种硬币,知道每种的面值Ai和每种的数量Ci.问能凑出多少种不大于m的面值. 输入 有多组数据,每一组第一行有两个整数 n(1≤n≤100)和m(m≤100000),第二行有2n个整数, ...
- hdu1059&poj1014 Dividing (dp,多重背包的二分优化)
Problem Description Marsha and Bill own a collection of marbles. They want to split the collection a ...
- [DP之多重背包优化方法]
首先我们看一道有趣的题目 然后这道题很快想到是一个多重背包和无限背包混合体 那么我们就以这道题 来讨论一下多重背包的优化 首先我们看看朴素打法 memset(F,,]=; ;i<=N;i++) ...
- poj 1742 Coins(dp之多重背包+多次优化)
Description People in Silverland use coins.They have coins of value A1,A2,A3...An Silverland dollar. ...
随机推荐
- 《java 语言程序设计》第1章编程练习
1.1 public class test { public static void main(String[] args) { System.out.println("Welcome to ...
- Gnome桌面的下拉式终端: Guake
什么是Guake? Guake是应用于Gnome环境的下拉式终端.主要由Python编写,使用了一些C,它以GPL2+许可证发布,适用于Linux以及类似的系统.Guake的灵感来源于电脑游戏Quak ...
- [JS Compose] 3. Use chain for composable error handling with nested Eithers (flatMap)
We refactor a function that uses try/catch to a single composed expression using Either. We then int ...
- 微信公众帐号开发教程第4篇-----开发模式启用及接口配置Java
欢迎加入群:347245650 345531810 进行讨论相互交流 我的微信号:572839485 我的微信公众账号 我的微社区欢迎关注 索取源码←请点击 图床:没有服务器 拖拽图片 外网即 ...
- 【Python】【Nodejs】下载单张图片到本地,Python和Nodejs的比较
Python版本: # 下载单张图片到本地,看用时多少 import urllib.request import datetime starttime = datetime.datetime.now( ...
- Android 自己主动化測试(3)<monkeyrunner> 依据ID查找对象&touch&type (python)
我在之前的两篇文章中用java来实现过 Android 自己主动化測试(1)怎样安装和卸载一个应用(java).Android 自己主动化測试(2)依据ID查找对象(java). 可是本质上都是用mo ...
- UNIX网络编程读书笔记:基本TCP套接口编程
编写一个完整的TCP客户和服务器程序所需要的基本套接口函数: 1.socket函数(客户端.服务器端都必须调用) 参数family指明协议族(family),该参数也往往被称为协议域(domain). ...
- ACM 刷题错误总结 持续更新并持续回想中o(╯□╰)o
一.段错误/RE 1.& 变量取地址 2.数组越界 3.爆栈, 非常可能是死循环,ruturn的边界没有处理好,或者是递归的内容里有死循环的部分. 4.线段树 逢写必错,都是build(i*2 ...
- 安卓手机使用Fiddler抓获HTTPS报文方法
Configure Fiddler Click Tools > Fiddler Options > Connections. Ensure that the checkbox by All ...
- Java之JVM调优案例分析与实战(5) - 服务器JVM进程奔溃
环境:一个基于B/S的MIS系统,硬件为2个CPU.8GB内存的HP系统,服务器是WebLogic9.2(就是第二个案例中的那个系统).正常运行一段时间后,最近发现在运行期间频繁出现集群节点的虚拟机进 ...