题意:有现今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的更多相关文章

  1. 单调队列优化DP,多重背包

    单调队列优化DP:http://www.cnblogs.com/ka200812/archive/2012/07/11/2585950.html 单调队列优化多重背包:http://blog.csdn ...

  2. dp之多重背包poj2392

    题意:有k种石头,高为hi,在不超过ai的高度下,这种石头可以放置,有ci种这个石头,求这些石头所能放置的最高高度......... 思路:以往的什么硬币种数,最大硬币数之类的,他们的硬币都已经是排好 ...

  3. dp之多重背包hdu1059

    题意:价值为1,2,3,4,5,6. 分别有n[1],n[2],n[3],n[4],n[5],n[6]个.求能否找到满足价值刚好是所有的一半的方案. 思路:简单的多重背包,我建议多重背包都用二进制拆分 ...

  4. nyoj 546——Divideing Jewels——————【dp、多重背包板子题】

    Divideing Jewels 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 Mary and Rose own a collection of jewells. ...

  5. dp之多重背包(二进制优化)

    void solve(int v,int w,int c){    int count=0;    for(int k=1;k<=c;k<<=1)    {        val[c ...

  6. 硬币问题 (dp,多重背包的二分优化)

    题目描述 给你n种硬币,知道每种的面值Ai和每种的数量Ci.问能凑出多少种不大于m的面值. 输入 有多组数据,每一组第一行有两个整数 n(1≤n≤100)和m(m≤100000),第二行有2n个整数, ...

  7. hdu1059&poj1014 Dividing (dp,多重背包的二分优化)

    Problem Description Marsha and Bill own a collection of marbles. They want to split the collection a ...

  8. [DP之多重背包优化方法]

    首先我们看一道有趣的题目 然后这道题很快想到是一个多重背包和无限背包混合体 那么我们就以这道题 来讨论一下多重背包的优化 首先我们看看朴素打法 memset(F,,]=; ;i<=N;i++) ...

  9. poj 1742 Coins(dp之多重背包+多次优化)

    Description People in Silverland use coins.They have coins of value A1,A2,A3...An Silverland dollar. ...

随机推荐

  1. 领扣-209 长度最小的子数组 Minimum Size Subarray Sum MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  2. 性能调优的Windows窗体DataGridView控件

    性能调优的Windows窗体DataGridView控件 . 净框架4.5     在处理大量数据时, DataGridView 控制可以消耗大量的内存开销,除非你仔细地使用它. 在客户有限的内存,你 ...

  3. [Functional Programming] Monad

    Before we introduce what is Monad, first let's recap what is a pointed functor: A pointed functor is ...

  4. (笔试题)质数因子Prime Factor

    题目: Given any positive integer N, you are supposed to find all of its prime factors, and write them ...

  5. 极客Web前端开发资源大荟萃#001

    每周极客都将总结本周最精彩的素材提供给大家,希望可以带给你更多地灵感和帮助!极客#GB课程库#现已上线,无论你是初级.中级.还是正在进修的高级前端工程师.这里都将帮助你得到更多更高效的学习.原文:极客 ...

  6. javascript代码在线测试

    目前还不可用,有知道的怎么搞的,请告知我下,谢谢! alert("欢迎使用javascript在线测试工具");

  7. 根据wsdl文件生成java代码

    具体操作步骤: 1.  运行cmd命令 输入 C:\jdk-1_6_0_31\bin (根据自己的JDK的安装位置而定) 2.  新建gen.bat文件 3.  gen.bat文件内容为:wsimpo ...

  8. 为pc编译配置安装当前最新的内核

    搜索公众号:itxxgh  (IT学习干货),全公益.免费.定期,提供,<IT学习教程>.不会骚扰大家,仅仅需轻点关注,也会传播<中华传统文化>传播正能量.  或扫描二维码 1 ...

  9. 【十二】注入框架RoboGuice使用:(Your First Injected ContentProvider)

    上一篇我们简单的介绍了一下RoboGuice的使用([十一]注入框架RoboGuice使用:(Your First Injection into a Custom View class)),今天我们来 ...

  10. STL之hashtable源代码剖析

    // Filename: stl_hashtable.h /////////////////////////////////////////////////////////////////////// ...