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; }