01背包问题
有n个重量和质量分别为wi,和vi的物品,从中选出总质量不超过W的物品,求价值最大值
input
4
2 3
1 2
3 4
2 2
5
output
7
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
int n,a[100],b[100],w;
int rec(int i,int j)
{
int res;
if(i==n)
{
res=0;
}
else if(j<a[i])
{
res=rec(i+1,j);
}
else
{
res=max(rec(i+1,j),rec(i+1,j-a[i])+b[i]);
}
return res;
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d%d",&a[i],&b[i]);
}
scanf("%d",&w);
printf("%d\n",rec(0,w));
return 0;
}
这个如果n很大的话就不适合,所以要优化,
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
int n,a[100],b[100],w,dp[100][100];
int rec(int i,int j)
{
int res;
if(dp[i][j]>=0)
{
return dp[i][j];//记录结果
}
if(i==n)
{
res=0;
}
else if(j<a[i])
{
res=rec(i+1,j);
}
else
{
res=max(rec(i+1,j),rec(i+1,j-a[i])+b[i]);
}
return dp[i][j]=res;
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d%d",&a[i],&b[i]);
}
memset(dp,-1,sizeof(dp));//头文件string
scanf("%d",&w);
printf("%d\n",rec(0,w));
return 0;
}
memset按照1字节为单位对内存进行填充,-1的每一个二进制位都是1,所以可以像0一样用memset进行初始化,但是无法初始化成1.