题意:有k种石头,高为hi,在不超过ai的高度下,这种石头可以放置,有ci种这个石头,求这些石头所能放置的最高高度.........

思路:以往的什么硬币种数,最大硬币数之类的,他们的硬币都已经是排好序了的,总是从小到大,但是这个题目不同,它有着最高高度的限制,那么在思考的时候,要得到最优的,那么首先就是要对ai排序......这是贪心,然后就是多重背包了........

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
struct node
{
int h;
int a;
int c;
}s[500];
int dp[50000],num[41000];
int cmp(const node p,const node q)
{
return p.a<q.a;
}
int main()
{
int n;
while(scanf("%d",&n)>0)
{
int maxx=0;
for(int i=1;i<=n;i++)
{
scanf("%d %d %d",&s[i].h,&s[i].a,&s[i].c);
if(maxx<s[i].a)
maxx=s[i].a;
}
sort(s+1,s+1+n,cmp);
memset(dp,0,sizeof(dp));
dp[0]=1;
for(int i=1;i<=n;i++)
{
memset(num,0,sizeof(num));
for(int j=s[i].h;j<=maxx;j++)
if(dp[j-s[i].h]&&dp[j-s[i].h]+s[i].h>dp[j]&&dp[j-s[i].h]+s[i].h-1<=s[i].a&&num[j-s[i].h]<s[i].c)
{
dp[j]=dp[j-s[i].h]+s[i].h;
//printf("%d %d\n",dp[j],s[i].h);
num[j]=num[j-s[i].h]+1;
//if(dp[j]==37)
//printf("%d\n",num[j]);
}
}
int maxn=0;
for(int i=0;i<=maxx;i++)
if(maxn<dp[i])
maxn=dp[i];
printf("%d\n",maxn-1);
}
return 0;
}
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
struct node
{
int h;
int a;
int c;
}s[500];
int dp[50000],c[5000][2];
int cmp(const node p,const node q)
{
return p.a<q.a;
}
int main()
{
int n;
while(scanf("%d",&n)>0)
{
int cnt=0,maxx=0;
for(int i=1;i<=n;i++)
{
scanf("%d %d %d",&s[i].h,&s[i].a,&s[i].c);
if(maxx<s[i].a)
maxx=s[i].a;
}
//printf("%d\n",maxx);
sort(s+1,s+1+n,cmp);
//for(int i=1;i<=n;i++)
//printf("%d %d %d\n",s[i].h,s[i].a,s[i].c);
for(int i=1;i<=n;i++)
{
int k=1;
while(s[i].c-k>0)
{
c[cnt][0]=k*s[i].h;
c[cnt++][1]=s[i].a;
s[i].c-=k;
k*=2;
//if(s[i].h==5)
//printf("%d %d\n",c[cnt-1][0],c[cnt-1][1]);
}
c[cnt][0]=s[i].h*s[i].c;
c[cnt++][1]=s[i].a;
}
memset(dp,0,sizeof(dp));
dp[0]=1;
for(int i=0;i<cnt;i++)
{
for(int j=maxx;j>=c[i][0];j--)
if(dp[j-c[i][0]]&&dp[j-c[i][0]]+c[i][0]-1<=c[i][1]&&dp[j-c[i][0]]+c[i][0]>dp[j])
{
dp[j]=dp[j-c[i][0]]+c[i][0];
//printf("%d\n",dp[j]);
}
}
int maxn=0;
for(int i=0;i<=maxx;i++)
if(maxn<dp[i])
maxn=dp[i];
printf("%d\n",maxn-1);
}
return 0;
}

dp之多重背包poj2392的更多相关文章

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

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

  2. dp之多重背包hdu1059

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. dp之多重背包poj1276

    题意:有现今cash,和n种钱币,每种钱币有ni个,价值为di,求各种钱币组成的不超过cash的最大钱数....... 思路:二进制拆分转化为01背包,或者转化为完全背包都是可以的. 反思:这个题目我 ...

随机推荐

  1. XMPP键盘订制实现图文混排

    在现阶段的通信服务中,各种标准都有,因此会出现无法实现相互连通,而XMPP(Extensible Message and presence Protocol)协议的出现,实现了整个及时通信服务协议的互 ...

  2. Java Drp项目实战—— 环境搭建

    概要 我们要開始一个关于Java项目的开发,那么我们就须要搭建一个关于Java开发的环境,那么搭建一个Java开发环境,都须要些什么东东,又有些什么注意事项呢. 过程 我先将我搭建Java环境的软件和 ...

  3. 用sc命令查询系统状态

    用sc命令查询系统状态 sc query 语法 sc query                - Enumerates status for active services & driver ...

  4. UIWebView页面的控制(二)

    1.UIWebView的内容控制的属性/方法列表 loading属性               确认当前页面是否在读入中 canGoForward属性   确认goForward  方法是否可运行, ...

  5. DD_belatedPNG

    我们知道IE6是不支持透明的PNG的,这无疑限制了网页设计的发挥空间. 然而整个互联网上解决这个IE6的透明PNG的方案也是多不胜数,从使用IE特有的滤镜或是e­xpression,再到javascr ...

  6. C#基础视频教程7.4 如何编写简单游戏

    接下来我们实现整个的游戏流程,当点击开始游戏,则需要三个事情开始运行 1 小鸟初始化并往下掉(当然还是可以用按钮让他飞一下) 2 每隔一定时间从左侧产生一个管子(宽度和高度随机,产生周期2000ms左 ...

  7. angularjs中使用$scope.$watch监控对象模型的变化

    如果对象模型发生变化时,可以使用$scope.$watch监控变化 <html ng-app="myApp"> <head> <title>an ...

  8. codechef The Ball And Cups题解

    The Ball And Cups At the end of a busy day, The Chef and his assistants play a game together. The ga ...

  9. Jquery—Jquery中的(function($){...})(jQuery)

    当你第一眼看到"(function($){...})(jQuery)"的时候.你有什么感觉?呵呵呵,我当时还是止不住的从心底里骂了一句--操,这他妈什么劳什子.时过境迁,对于如今无 ...

  10. Linux环境下的make和makefile详解

    无论是在Linux还是在Unix环境中,make都是一个非常重要的编译命令.不管是自己进行项目开发还是安装应用软件,我们都经常要用到make或make install.利用make工具,我们可以将大型 ...