B - 小背包 HRBUST - 1558

版权声明:个人博客:www.jingyile.cn 萌新发博文积累经验,欢迎各位大佬指导!!! https://blog.csdn.net/JYL1159131237/article/details/77523542

有一个容量为m(1<=m<=4000000)的背包,有n(1<=n<=16)个物品,每个物品有体积v(1<=v<=2012)和价值w(0<=2012),现在要你选择一些物品,使得背包所装物品的总价值最大。

Input

有多组测试数据,但是不会超过10组。

对于每组测试数据,第一行是两个整数m和n,表示背包容量的和物品个数。接下来有n行,每行有两个整数,表示一个物品的体积和价值。

输入到文件结束。

Output

对于每组测试数据,输出一行,包含一个整数,为背包能装下物品的最大价值。

Sample Input
10 3
6 9
5 5
5 5
3 2
1 2
2 1
Sample Output
10

3

/*看到这个题首先想到了去年数据结构中的一道题,
与这个类似,于是按照原思路写出下面的代码,
自己测试没有问题,提交却显示wrong answer*/
#include <stdlib.h>
#include <stdio.h>
#define x 16
int w[x];//物品体积
int v[x];//物品价格
int capacity;//背包容量
int q[x]={-1};//当q[i]数组为1时表示选择了此件物品
int bag(int n,int c)
{
    if (n==0||c==0)//当物品数量为0或背包容量为0时
        return 0;
    else
    {

        if ((w[n]<=c)&&((bag(n-1,c-w[n])+v[n])>bag(n-1,c)))//当前体积小于背包容量且选择了当前的物品时价值大于没有选择时,将选择此物品。ya
        {
            q[n]=1;//表示选择了此物品
            return bag(n-1,c-w[n])+v[n];
        }
        else
        {
            q[n]=0;//没有选择此物品
            return bag(n-1,c);
        }
    }
}
int main()
{
    int n,i,j;
    int maxv;
    while(scanf("%d",&capacity)!=EOF)

    {
        scanf("%d",&n);
for(j=1; j<=n; j++)
    {
        scanf("%d %d",&w[j],&v[j]);
    }
    maxv=bag(n,capacity);
    printf("%d\n",maxv);
    }
    return 0;
}
参考网上解析,有如下AC代码:

#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
struct wupin
{
    int c,val;
}a[1000000];
int dp[101010];
int main()
{
    int v,n;
    while(~scanf("%d%d",&v,&n))
    {
        if(v>=32192)v=32192;//最多12个物品 每个物品最大体积为2012.v不能大于12*2012
        memset(dp,0,sizeof(dp));
        memset(a,0,sizeof(a));
        for(int i=0;i<n;i++)
        scanf("%d%d",&a[i].c,&a[i].val);
        for(int i=0;i<n;i++)
        {
            for(int j=v;j>=a[i].c;j--)
            {
                dp[j]=max(dp[j],dp[j-a[i].c]+a[i].val);
            }
        }
        printf("%d\n",dp[v]);
    }



没有更多推荐了,返回首页