HDU2602 01背包 xingxing在努力

  很经典的01背包, 假设f(i, j)是将i个物品放入容量为j的背包, 那么可得到如下递推式f(i, j) = max(f(i-1, j) , f(i-1, j-c[i])+v[i]))。。。。实现的话有两种方式, 一种是直接用二维数组实现, 另外一种是滚动数组, 不过要注意的是, 如果题意是让这些物品恰好装满背包,那么f(0, 0)为0其他为无穷大, 如果没必要恰好装满那就全部初始化为0;

代码如下:

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;
int f[1000 + 10][1000 + 10];
int N, V;
int vm[1000 + 10];    //占用的体积
int va[1000 + 10];    //所具有的价值

int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        scanf("%d%d", &N, &V);
        for(int i=1; i<=N; i++)
            scanf("%d", &va[i]);
        for(int i=1; i<=N; i++)
            scanf("%d", &vm[i]);
        memset(f, 0, sizeof(f));
        for(int i=1; i<=N; i++)
        {
            for(int j=0; j<=V; j++)      //前i中物品 容量不超过j时的最大值  不必恰好装满
            {
                if(j >= vm[i]) f[i][j] = max(f[i-1][j], f[i-1][j-vm[i]]+va[i]);
                else f[i][j] = f[i-1][j];
            }
        }
        printf("%d\n", f[N][V]);
    }
    return 0;
}

滚动数组

#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;
int N, V;
int vm[1000 + 10];   //体积
int va[1000 + 10];   //价值
int f[1000 + 10];    

int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        scanf("%d%d", &N, &V);
        for(int i=1; i<=N; i++)
            scanf("%d", &va[i]);
        for(int i=1; i<=N; i++)
            scanf("%d", &vm[i]);
        memset(f, 0, sizeof(f));             //滚动数组   不是恰好放满的背包
        for(int i=1; i<=N; i++)
        {
            for(int j=V; j>=0; j--)
            {
                if(j-vm[i] >= 0)
                    f[j] = max(f[j], f[j-vm[i]]+va[i]);
                else f[j] = f[j];
            }
        }
        printf("%d\n", f[V]);
    }
    return 0;
}
时间: 2024-11-08 23:30:30

HDU2602 01背包 xingxing在努力的相关文章

HDU2639 第k小01背包 xingxing在努力

这个题目是求解第k小01背包, 我们只需要再多加一维表示容量为j时的价值即可..代码里面用了归并排序的思想来求解f[j][k], 代码如下: #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int f[1000+10][35]; int A[35], B[35]; //A选 B不选 int W[100+10], V[100+10]; int N, v, K; v

POJ2923 状态压缩01背包 xingxing在努力

这道题算是很经典的状态压缩01背包了, 题意是有一个人要用两辆小汽车搬家, 每辆小汽车都有一个最大载重量, 现在有一些要搬的家具, 告诉你这些家具的重量, 问最少几次能将这些家具搬完(每次两辆汽车必须出动, 即使有一辆车什么都没有装)? 物品个数不超过10,根据经验一般有10存在的话都要带点暴力的色彩, 那么这道题就是先要预处理所有一次搬走的家具的集合, 然后就将其转化成了01背包的问假设d[i][j]是前i个家具中搬走了j(集合)家具所需要的最少次数那么d[i][j] = min(d[i-1]

HDU2602(01背包)

Bone Collector Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 44257    Accepted Submission(s): 18442 Problem Description Many years ago , in Teddy’s hometown there was a man who was called “Bon

POJ1787 完全背包 xingxing在努力

这道题的意思是给你1 5 10 25 的硬币c1 c2 c3 c4枚, 求出一个方案使硬币个数最多, 且恰好是p..给完全背包加几个状态即可..代码如下: WA点: 可能看完动漫时间有点晚记得把题目终止输入条件判错了 2:used[j-w[i]]<num[i]写错成used[j-w[i]]+1<num[i],罪过罪过: #include <cstdio> #include <cstring> #include <algorithm> using namesp

hdu2602 01背包Bone Collector

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 40316    Accepted Submission(s): 16748 Problem Description Many years ago , in Teddy's hometown there was a man who was called "Bone Collector&qu

POJ2184 01背包变形 xingxing在努力

这道题乍一看就有了思路,大体就是定了其中一个值然后再求另外一个值的最大值, 然而代码实现好坑, 题意是奶牛有两个属性 Ai和Bi, 让你求Ai和Bi和的最大值,注意Ai的和不能为负整数, Bi也一样..假设我们定了Ai我们来看下状态方程:f[i][j] = max(f[i-1][j], f[i-1][j-A[i]]+B[i]).当A[i]为正的时候就是我们经常遇到的01背包,使用滚动数组倒着排一遍, 然而当A[i]为负的时候我们就应该从小推到大,这样才对..代码如下: #include <cst

HDU2955 01背包变体 xingxing在努力

这道题的题意是小偷要去偷N家银行, 每家银行都有一个钱款数额Mi和被抓概率pi, 求小偷被抓的概率小于P的情况下所能偷到的钱数额的最大值(每家银行最多偷一次),由于每家银行最多偷一次, 所以这个题可以用01背包的思想来求解, 又因为小偷被抓会有很多种情况,并不好算,因此我们用他的反面小偷成功逃脱来算?这样题目就成了小偷在成功逃脱的概率大于1-P的情况下所能偷到的钱数最大值..记f[i][j]为小偷在前i家银行恰好偷了j块钱成功逃脱的 概率最大值, 那么f[i][j] = max(f[i-1][j

hdu2602 Bone Collector (01背包)

本文出自:http://blog.csdn.net/svitter 题意:典型到不能再典型的01背包.给了我一遍AC的快感. //============================================================================ // Name : 2602.cpp // Author : vit // Version : // Copyright : Your copyright notice // Description : Hello

HDU2602 Bone Collector 【01背包】

Bone Collector Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 28365    Accepted Submission(s): 11562 Problem Description Many years ago , in Teddy's hometown there was a man who was called "Bo