前言:
给定一个背包(载重量) n 种物品可以选择 物品都有重量和价值 如何选择能在不超过背包载重的情况下 获得最大价值 最大价值是多少?
物品个数:如果每种物品只有一个:01背包(此问题就是01背包)
每种物品无限个:完全背包
每种物品有多个但不是无限:多重背包
题目描述
有N件物品和一个容量为V的背包。放入第i件物品耗费的空间是Ci,得到的价值是Wi。求解在不超过容量的前提下,将哪些物品装入背包可使价值总和最大。
输入格式
第1行两个正整数,分别表示N和V,中间用一个空格隔开。
第2行N个正整数,表示Ci,中间用一个空格隔开。
第3行N个正整数,表示Wi,中间用一个空格隔开。
其中:1≤N≤100,1≤V≤106,1≤Ci≤10000,1≤Wi≤10000。
输出格式
一行一个正整数,表示最大的价值总和。
样例输入
4 20 8 9 5 2 5 6 7 3
样例输出
16
题目思路:一道动态规划(dp)题
状态转移方程推导:
一维数组优化(只优化空间):
#include<iostream> #include<cstdio> #include<algorithm> #include<queue> #include<vector> #include<stack> #include<string> #include<cmath> using namespace std; int c[110],w[110]; int dp[1000010]; //空间可能会爆炸 所以用了一维数组的优化 int main(){ int n, V,i,j; cin>>n>>V; for(i=1;i<=n;i++) scanf("%d",&c[i]);//输入 for(i=1;i<=n;i++) scanf("%d",&w[i]);//输入 //个人建议在竞赛中用printf 和 scanf 这样可以让输入输出速度变快 for(i=1;i<=n;i++)//前n种 { for(j=V;j>=c[i];j--)//可以少算部分空间 { dp[j]=max(dp[j],dp[j-c[i]]+w[i]);//状态转移方程 } } cout<<dp[V]; return 0; }
动态规划其他题目:
采药
开心的金明
疯狂的采药
淘宝之旅
小A点菜
等等