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.

posted @ 2016-08-30 20:57  小小姐  阅读(95)  评论(0编辑  收藏  举报