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 01背包 dp

点击打开链接题目链接 Bone Collector Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 ...

HDU 2602-Bone Collector(01背包-一/二维)

Bone Collector Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

HDU2602 Bone Collector(01背包模板 一维数组)

Many years ago , in Teddy’s hometown there was a man who was called “Bone Collector”. This man like ...

HDU 2602 Bone collector 01背包

裸的01背包,不解释 Bone Collector Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja...

HDU - 2602 Bone Collector(01背包)

Many years ago , in Teddy’s hometown there was a man who was called “Bone Collector”. This man like ...

hdu 2602 Bone Collector(01背包)

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission...

01背包的理解,二维数组化一维数组的理解(附hdu2602 Bone Collector)

01背包问题:有n个物品和一个容量为v的背包,用val[i]表示第i个物品的价值,用vol[i]表示第i个物品的体积,那么,如何使背包里装的物品的总价值最大呢?贪心是不行的,举个反例:n=3, v=1...

hdu 2602 Bone Collector (01背包 )

Bone Collector Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

HDU 2602Bone Collector 01背包

Bone Collector Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

HDU 2602 Bone Collector【01背包入门题】

01背包入门题: 转态转移方程: f[i][v] = max ( f[i-1][v],f[i-1][v-c[i] ]+w[i] ) f[i][v]:前 i 件物品放入容量为v的背包获得最大价值。 c[...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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