poj 2392 (Space Elevator) 1276 (Cash Machine)变形背包

这道题跟coins很像,看来楼教主的男人八题果然不简单。

进行coins式的背包处理就好了。

2392

#include<iostream>
#include<algorithm>
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#define max(a,b) ((a)>(b)?(a):(b))
typedef long long ll;
using namespace std;
const int maxn=41000;
struct P
{
    int a,b,c;
}p[maxn];
bool cmp( const struct P &a,const struct P&b)
{
    return a.b<b.b;
}
int dp[maxn],use[maxn];
int n,m,T;
int K;
int main()
{
    while(~scanf("%d",&K))
    {
        int maxh=0;
        for(int i=1;i<=K;i++)
                scanf("%d%d%d",&p[i].a,&p[i].b,&p[i].c);

        sort(p+1,p+1+K,cmp);
        memset(dp,-1,sizeof(dp));
        dp[0]=0;
        for(int i=1;i<=K;i++)
        {
            memset(use,0,sizeof(use));
            for(int j=p[i].a;j<=p[i].b;j++)
            {
                if( dp[j-p[i].a]!=-1 && use[j-p[i].a]<p[i].c && dp[j-p[i].a]+p[i].a>dp[j]  )
                {
                    use[j]=use[j-p[i].a]+1;
                    dp[j]=dp[j-p[i].a]+p[i].a;
                    maxh=max(maxh,dp[j]);
                }
            }
        }
        cout<<maxh<<endl;
    }
    return 0;
}

1276

#include<iostream>
#include<algorithm>
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#define max(a,b) ((a)>(b)?(a):(b))
typedef long long ll;
using namespace std;
const int maxn=10+1000;
struct P
{
    int a,c;
}p[maxn];

int dp[maxn*1000],use[maxn*1000];
int n,m,T;
int K;
int main()
{
    while(~scanf("%d",&K))
    {
        int maxh=0;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
                scanf("%d%d",&p[i].c,&p[i].a);

        memset(dp,-1,sizeof(dp));
        dp[0]=0;
        for(int i=1;i<=n;i++)
        {
            memset(use,0,sizeof(use));
            for(int j=p[i].a;j<=K;j++)
            {
                if( dp[j-p[i].a]!=-1 && use[j-p[i].a]<p[i].c && dp[j-p[i].a]+p[i].a>dp[j]  )
                {
                    use[j]=use[j-p[i].a]+1;
                    dp[j]=dp[j-p[i].a]+p[i].a;
                    maxh=max(maxh,dp[j]);
                }
            }
        }
        cout<<maxh<<endl;
    }
    return 0;
}
时间: 2024-12-27 12:51:49

poj 2392 (Space Elevator) 1276 (Cash Machine)变形背包的相关文章

POJ 2392 Space Elevator 背包题解

多重背包,本题不需要二分优化.相对简单点.因为重复数十分小,小于10: 而增加一个限制每种材料的高度做法,如果使用逆向填表,那么只需要从这个高度往小递归填表就可以了. 还有就是注意要排序,以限制高度为标准从小到大排序,否则答案错误的. #include <stdio.h> #include <string.h> #include <algorithm> using std::sort; const int MAX_K = 401; const int MAX_H = 4

poj 1276 Cash Machine (多重背包)

链接:poj 1276 题意:已知金额cash,给定几种不同面值的货币的数量及面值,求利用给定的货币可以凑成 小于等于cash的金额的最大值 分析:因为每种货币的面值及数量已知,可以将其转化为多重背包,背包的容量即为cash, 每个物品的价值及费用都为每种货币的面值. 多重背包可以转化为01背包,不过这样会超时,为了避免这样,可以转化为完全背包和二进制思想的01背包 #include<stdio.h> #include<string.h> int f[100010],v; int

POJ 2392 Space Elevator(贪心+多重背包)

POJ 2392 Space Elevator(贪心+多重背包) http://poj.org/problem?id=2392 题意: 题意:给定n种积木,每种积木都有一个高度h[i],一个数量num[i],还有一个限制条件,这个积木所在的位置不能高于limit[i],问能叠起的最大高度? 分析: 本题是一道多重背包问题, 不过每个物品的选择不仅仅要受该种物品的数量num[i]限制, 且该物品还受到limit[i]的限制. 这里有一个贪心的结论: 我们每次背包选取物品时都应该优先放置当前limi

poj 2392 Space Elevator(多重背包+先排序)

Description The cows are going to space! They plan to achieve orbit by building a sort of space elevator: a giant tower of blocks. They have K (1 <= K <= 400) different types of blocks with which to build the tower. Each block of type i has height h

POJ 1276 Cash Machine(多重背包的二进制优化)

题目网址:http://poj.org/problem?id=1276 思路: 很明显是多重背包,把总金额看作是背包的容量. 刚开始是想把单个金额当做一个物品,用三层循环来 转换成01背包来做.T了-- 后面学习了 用二进制来处理数据. 简单地介绍一下二进制优化:?(? ? ??)  假设数量是8,则可以把它看成是1,2,4,1的组合,即这4个数的组合包括了1-8的所有取值情况.这是为什么呢?将它们转换成二进制再观察一下: 1:1 2:10 4:100 1:1 二进制都只有0,1.所以1,2,4

poj 2392 Space Elevator (多重背包)

Space Elevator Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8110   Accepted: 3843 题目大意  :一群牛要上天  用一些石块堆塔  给出石块的种类  及其每个种类的数量 和该种石块能出现的最高高度  和每种石块的数量 求怎么摆放才能堆得最高 多重背包模板题.... 将所有石块排序  把高度低的放下面 #include<iostream> #include<cstdio>

POJ 2392 Space Elevator(多重背包)

Description The cows are going to space! They plan to achieve orbit by building a sort of space elevator: a giant tower of blocks. They have K (1 <= K <= 400) different types of blocks with which to build the tower. Each block of type i has height h

POJ 1276 Cash Machine 多重背包--二进制优化

点击打开链接 Cash Machine Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 28337   Accepted: 10113 Description A Bank plans to install a machine for cash withdrawal. The machine is able to deliver appropriate @ bills for a requested cash amount

POJ 2392 Space Elevator 贪心+dp

题目链接: http://poj.org/problem?id=2392 题意: 给你k类方块,每类方块ci个,每类方块的高度为hi,现在要报所有的方块叠在一起,每类方块的任何一个部分都不能出现在ai以上的高度,问这些方块能叠的最高高度. 题解: 首先按ai升序排序,尽量让高度限制低的先排掉,如果不这样做一些转移会失效掉: 比如:h1=3,a1=3;h2=4,a2=7 如果先搭1再搭2则合法,但反过来则变成无效的转移了. 处理好顺序之后跑一遍背包就可以了,因为最大高度为40000,比较小,所以用