做背包题目:要注意一点就是各个数组的初始化!
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;
}