01背包 无限背包

现有一个容量大小为V的背包和N件物品,每件物品有两个属性,体积和价值,请问这个背包最多能装价值为多少的物品?
链接:https://www.nowcoder.com/questionTerminal/708f0442863a46279cce582c4f508658
来源:牛客网
输入描述:
第一行两个整数V和n。
接下来n行,每行两个整数体积和价值。1≤N≤1000,1≤V≤20000。
每件物品的体积和价值范围在[1,500]。
输出描述:
输出背包最多能装的物品价值。


01背包问题:

这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。

用子问题定义状态:即c[i][v]表示前i件物品恰放入一个重量为m的背包可以获得的最大价值。则其状态转移方程便是:

c[i][m]=max{c[i-1][m],c[i-1][m-w[i]]+p[i]}


// niuke.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdio.h>

int maxVal(int a, int b);

int main()
{
    int V = 0;
    int N = 0;
    int size[1010] = {0};
    int val[1010] = {0};
    int result[20010] = {0};
    
    scanf("%d %d", &V, &N);
    
    for(int i = 0; i < N; ++i)
    {
        scanf("%d %d",&size[i],&val[i]);
    }
    for(int i = 0; i < N; ++i)//01背包
    {
        //无限背包  for(int j=size[i]; j <= V; j++)
        for(int j = V; j >= size[i]; --j)
        {
            result[j] = maxVal(result[j], result[j - size[i]] + val[i]);
        }
    }
    printf("%d",result[V]);
    return 0;
}
 
int maxVal(int a, int b)
{
    return a >= b ? a : b;
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务