hdu2602题解bone collector(01背包)

原创 2016年05月30日 23:13:12

这是我做的第一道背包问题,推荐背包九讲,经典!!!
状态转移方程: f[i][vi]=maxx(f[i-1][vi],f[i-1][vi-vo[i]]+va[i])
这是直接由状态转移方程推出的代码(网上很少见到,但初学者容易理解),内存上可以进行优化

#include <stdio.h>
#include <string.h>
#define maxx(X,Y) ((X)>(Y)?(X):(Y))
int f[1003][1003];
int main(int argc, char const *argv[])
{
    int T,N,V,va[1003],vo[1003],i,vi;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d %d",&N,&V);
        for(i=1;i<=N;i++)
            scanf("%d",va+i);
        for(i=1;i<=N;i++)
            scanf("%d",vo+i);
        memset(f,0,sizeof(f));
        for(i=1;i<=N;i++)
        {
            for(vi=0;vi<=V;vi++)//骨头的重量可以是0,不信的话你让vi=1开始。。。。
                if(vo[i]<=vi)   f[i][vi]=maxx(f[i-1][vi],f[i-1][vi-vo[i]]+va[i]);   
                    else f[i][vi]=f[i-1][vi];
        }
        printf("%d\n",f[N][V] );
    }
    return 0;
}

事实上,只要vi从V到vo[i]逆着来就可以了,顺着来的话就是完全背包了

#include <stdio.h>
#include <string.h>
#define maxx(X,Y) ((X)>(Y)?(X):(Y))
int f[1003];
int main(int argc, char const *argv[])
{
    int T,N,V,va[1003],vo[1003],i,vi;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d %d",&N,&V);
        for(i=1;i<=N;i++)
            scanf("%d",va+i);
        for(i=1;i<=N;i++)
            scanf("%d",vo+i);
        memset(f,0,sizeof(f));
        for(i=1;i<=N;i++)
        {
            for(vi=V;vi>=vo[i];vi--)
                f[vi]=maxx(f[vi],f[vi-vo[i]]+va[i]);    
        }
        printf("%d\n",f[V] );
    }
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

HDU - 2602 Bone Collector解题报告

背包问题第一道
  • qq_36306833
  • qq_36306833
  • 2017年01月31日 23:40
  • 313

【杭电oj】2602 - Bone Collector(01背包)

Bone Collector Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T...
  • wyg1997
  • wyg1997
  • 2016年04月22日 21:47
  • 422

hdu2602 Bone Collector (01背包裸题)

分析:经典的01背包题,给出了石头的数量与背包的容量,然后分别给出每个石头的容量与价值,要求最优解,可以说是01背包果题。 题目:http://acm.hdu.edu.cn/showproblem...
  • f1024042400
  • f1024042400
  • 2014年12月25日 19:14
  • 294

HDU2602 Bone Collector 【01背包】

Bone Collector Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others...
  • u012846486
  • u012846486
  • 2014年07月19日 23:44
  • 732

hdu2602 bone collector 01背包

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2602 翻译: #问题描述 多年以前,在Teddy的家乡,有个叫骨头收集者的人。这个人喜欢收集各种...
  • gone_wt_wind
  • gone_wt_wind
  • 2013年06月30日 22:11
  • 391

hdu2602 Bone Collector (01背包)

#include #include #define MAXN 1002 //01背包 struct node { int vol,val; }bone[MAXN]; int main() { ...
  • lezong2011
  • lezong2011
  • 2013年07月27日 19:42
  • 460

hdu2602 Bone Collector(01背包)

http://acm.hdu.edu.cn/webcontest/contest_showproblem.php?pid=1003&ojid=0&cid=5510&hide=0 Problem ...
  • u010368749
  • u010368749
  • 2013年08月07日 08:37
  • 478

hdu2602 Bone Collector (01背包)

本文出自:http://blog.csdn.net/svitter 题意:典型到不能再典型的01背包。给了我一遍AC的快感。 //=========================...
  • svitter
  • svitter
  • 2014年05月02日 16:36
  • 1966

HDU2602 Bone Collector(01背包)

题目: Bone Collector Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth...
  • riba2534
  • riba2534
  • 2016年11月22日 11:23
  • 214

hdu2602 Bone Collector(01背包)

Bone Collector Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T...
  • u011697060
  • u011697060
  • 2014年02月21日 09:18
  • 329
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hdu2602题解bone collector(01背包)
举报原因:
原因补充:

(最多只允许输入30个字)