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

问题描述
   话说,上次小P到伊利哇呀国旅行得到了一批宝藏。他是相当开心啊,回来就告诉了他的好基友小鑫,于是他们又结伴去伊利哇呀国寻宝。
   这次小P的寻宝之路可没有那么的轻松,他们走到了一个森林,小鑫一不小心被触发了机关,被困在了一个大笼子里面,笼子旁边上有一道题目和一个密码锁,上面说只要解出此题输入密码即可救出被困人。小鑫不是很聪明,所以他做不出来,他知道小P很笨,更解不出来。所以他就让小P独自回去,不用管他。但是小P重情重义不会抛弃他离去。他说:“不,好基友一起走!”。于是就感动了上帝,上帝特派你来替他们解决问题。聪明的你要加油了啊!
题目描述:给你n种物品和一个体积为v的包包。每种物品有无数种,体积是vi价值是wi。求出包包v所能装的最大价值的东西。
输入
  多组输入。第一行有两个正整数n(0<n<=10000), v(0<v<= 10000)。接下来两行每行有n个数字。第一行表示每种物品的价值wi(0<wi<100),第二行表示每种物品的体积vi(0<vi<100)。
输出
输出最多可以得到的价值。输出结果救出小鑫。
示例输入
5 20
1 2 3 4 5
2 6 3 5 4
示例输出
25

  本题是典型的完全背包问题,每个物品可选取无数次,因此不能单纯的用0-1背包来解决这道问题,当然,贪心也很难将此问题解决。所以采用完全背包来解决此问题,主要代码如下:

#include<stdio.h>
int max(int x,int y)
{
    if(x>y)
        return x;
    else
        return y;
}
int main()
{
    int n,i,j,m;
    int w[10001];
    int v[10001];
    int p[10001];
    while(~scanf("%d%d",&n,&m))
    {
        for(i=1; i<=n; i++)
        {
            scanf("%d",&w[i]);
        }
        for(i=1; i<=n; i++)
        {
            scanf("%d",&v[i]);
        }
        for(i=1; i<=m; i++)
        {
            p[i]=0;
        }
        for(i=1; i<=n; i++)
        {
            for(j=v[i]; j<=m; j++) // 这是和0-1背包的区别所在
            {
                if(p[j-v[i]]+w[i]>p[j]) //
                {
                    p[j]=max(p[j],p[j-v[i]]+w[i]);  //
                }
            }
        }
        printf("%d\n",p[m]);
    }
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值