(1)题目:有n个重量和价值分为w(i),v(i)的物品。从这些物品中挑选出总重量不超过W的物品,求所有挑选方案中价值总和的最大值。
*限制条件:
1<=n<=100
1<=w(i),v(i)<=100
1<=W<=10000
(2)时间复杂度:O(W*n);
(3)总结:下面代码为01背包中经过优化后的方法。时间复杂度为O(W*n)。
(4)测试数据:Sample input:首行为物品的个数n和目标价值W,紧随其后有两行,第一行为物品的重量,第二行为其价值。
Sample output:输出挑选的价值总和的最大值。
4 5
2 1 3 2
3 2 4 2
(5)代码:
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAX_N=1e2+6;
int n,W;
int w[MAX_N],v[MAX_N],dp[MAX_N][MAX_N];
int rec(int i,int j){
if(dp[i][j]>=0)return dp[i][j];
int res;
if(i==n)res=0;
else if(j<w[i])res=rec(i+1,j);
else res=max(rec(i+1,j),rec(i+1,j-w[i])+v[i]);
return dp[i][j]=res;
}
int main(){
ios::sync_with_stdio(false);cin.tie(0);
cin>>n;
for(int i=0;i<n;i++)cin>>w[i]>>v[i];
cin>>W;
memset(dp,-1,sizeof(dp));
cout<<rec(0,W);
}