背包问题(完全,0-1)

完全背包

小P寻宝记——好基友一起走

Time Limit: 1000 ms Memory Limit: 65536 KiB

Submit Statistic

Problem Description

话说,上次小P到伊利哇呀国旅行得到了一批宝藏。他是相当开心啊,回来就告诉了他的好基友小鑫,于是他们又结伴去伊利哇呀国寻宝。

这次小P的寻宝之路可没有那么的轻松,他们走到了一个森林,小鑫一不小心被触发了机关,被困在了一个大笼子里面,笼子旁边上有一道题目和一个密码锁,上面说只要解出此题输入密码即可救出被困人。小鑫不是很聪明,所以他做不出来,他知道小P很笨,更解不出来。所以他就让小P独自回去,不用管他。但是小P重情重义不会抛弃他离去。他说:“不,好基友一起走!”。于是就感动了上帝,上帝特派你来替他们解决问题。聪明的你要加油了啊!

题目描述:给你n种物品和一个体积为v的包包。每种物品有无数种,体积是vi价值是wi。求出包包v所能装的最大价值的东西。PS:每个物品有很多个

Input

多组输入。第一行有两个正整数n(0<n<=10000), v(0<v<= 10000)。接下来两行每行有n个数字。第一行表示每种物品的价值wi(0<wi<100),第二行表示每种物品的体积vi(0<vi<100)。

Output

输出最多可以得到的价值。输出结果救出小鑫。

Sample Input

5 20

1 2 3 4 5

2 6 3 5 4

Sample Output

25

Hint

Source

xfl

 

#include <stdio.h>
#include <string.h>
int max(int a,int b)
{
    if (a>b) return a;
    else return b;
};
int a[100000];
int main ()
{
    int n,i,g,j,p[20000],m[20000];
    while(scanf("%d%d",&n,&g)!=EOF)
    {
        memset(m,0,sizeof(m));
        memset(p,0,sizeof(p));
        memset(a,0,sizeof(a));
        for (i=1;i<=n;i++)
        {
            scanf("%d",&m[i]);
        }
        for (i=1;i<=n;i++)
        {
            scanf("%d",&p[i]);
        }
        for (i=1;i<=n;i++)
            for (j=1;j<=g;j++)
            {
                if (j>=p[i])
                a[j]=max(a[j],a[j-p[i]]+m[i]);
            }
        printf("%d\n",a[g]);
    }
    return 0;
}

 

 

 

0-1背包

小P寻宝记——粗心的基友

Time Limit: 1000 ms Memory Limit: 65536 KiB

Submit Statistic

Problem Description

这对好基友他们在经历无数的艰难险阻后,终于找到了宝藏。无奈的是这一对好基友竟然是一样的粗心,又忘记了带一个大一点的包包,可惜啊、、选择又出现了啊、、

已知包的体积是v,每种宝贝只有一个,宝贝的体积是pi,价值是wi。求出这对粗心的基友可以最多带走价值多少的宝藏。

Input

输入数据有多组。

每组第一行有两个正整数n(n <= 10000)和v(v <= 10000)分别表示n种宝贝和包的体积。

接下来n行,每行有两个正整数vi, wi。

分别表示每种宝藏的体积vi (vi<=1000),价值wi(wi<=1000)。

Output

这对基友所能带走的最多的宝藏。

Sample Input

5 10

1 5

2 4

3 3

4 2

5 1

Sample Output

14

Hint

Source

xfl

#include <stdio.h>
#include <string.h>
int max(int a,int b)
{
    if (a>b) return a;
    else return b;
};
int a[100000];
int main ()
{
    int n,i,g,j,p[20000],m[20000];
    while(scanf("%d%d",&n,&g)!=EOF)
    {
        memset(m,0,sizeof(m));
        memset(p,0,sizeof(p));
        memset(a,0,sizeof(a));
        for (i=1;i<=n;i++)
        {
            scanf("%d%d",&p[i],&m[i]);
        }
        for (i=1;i<=n;i++)
            for (j=g;j>=0;j--)
            {
                if (j>=p[i])
                a[j]=max(a[j],a[j-p[i]]+m[i]);
            }
        printf("%d\n",a[g]);
    }
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值