HDU 2602 01背包中两种写法

来源:互联网 发布:程序员去哪个招聘网站 编辑:程序博客网 时间:2024/06/07 01:07

做背包题目:要注意一点就是各个数组的初始化!01背包中初始化要分两种情况:1:恰好装满,就是const int inf=0x3f3f3f3f;  f[0]=0; for(i=1; i<maxn; i++){       f[i]=inf;}2:如果没有要求恰好装满!!!那就可以这样赋值!for(i=0; i<maxn; i++){       f[i]=0;}//一维数组写的!#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define maxn 1005__int64 value[maxn],cost[maxn];__int64 f[maxn];__int64 n,v;__int64 zeroback(__int64 val, __int64 cos){    for(__int64 i=v; i>=cos; i--)    {        f[i]=max(f[i],f[i-cos]+val);    }}int main(){    __int64 t,i;    scanf("%I64d",&t);    while(t--)    {        memset(value,0,sizeof(value));        memset(cost,0,sizeof(cost));        memset(f,0,sizeof(f));        scanf("%I64d%I64d",&n,&v);        for(i=1; i<=n; i++)        {            scanf("%I64d",&value[i]);        }        for(i=1; i<=n; i++)        {            scanf("%I64d",&cost[i]);        }        for(i=1; i<=n; i++)        {            zeroback(value[i],cost[i]);        }        printf("%I64d\n",f[v]);    }    return 0;}二维写的:#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn=1005;int value[maxn],cost[maxn];int f[maxn][maxn];int main(){    int t,n,v;    int i,j;    scanf("%d",&t);    while(t--)    {        memset(value,0,sizeof(value));        memset(cost,0,sizeof(cost));        memset(f,0,sizeof(f));        scanf("%d%d",&n,&v);        for(i=1; i<=n; i++)        {            scanf("%d",&value[i]);        }        for(i=1; i<=n; i++)        {            scanf("%d",&cost[i]);        }        for(i=1; i<=n; i++)        {            for(j=v; j>=0; j--)            {                if(j>=cost[i])//这里是判断该物品是否放的下!!!                {                    f[i][j]=max(f[i-1][j],f[i-1][j-cost[i]]+value[i]);                }                else                {                    f[i][j]=f[i-1][j];                }            }        }        printf("%d\n",f[n][v]);    }    return 0;}