HDU 2602 Bone Collector(01背包)

来源:互联网 发布:约会交友app源码 编辑:程序博客网 时间:2024/05/18 02:57

题目链接

HDU 2602

思路分析

已知不同骨头的体积和价值,在背包V中如何放才能有最大价值。

外层循环使用i表示对第i个骨头的处理,内层用逆序使比较的是前一状态

f[v] = max{f[v],f[v-c[i]]+w[i]}
骨头I放和不放之间取最大值

代码

#include <stdio.h>#include <string.h>int main(){    int t,i,v;    int N,V;    int c[1010],w[1010];    int f[1010];    scanf("%d",&t);    while(t--)    {        scanf("%d%d",&N,&V);        for(i=1;i<=N;i++)            scanf("%d",&w[i]);        for(i=1;i<=N;i++)            scanf("%d",&c[i]);        memset(f,0,sizeof(f));        for(i=1;i<=N;i++)            for(v=V;v>=c[i];v--)//逆序                if(f[v] < f[v-c[i]]+w[i])                    f[v] = f[v-c[i]]+w[i];//调用的f是前一状态        printf("%d\n",f[V]);    }    return 0;}



原创粉丝点击