一、01背包问题
n个重量和价值分别为wi,vi的物品,从这些物品中挑出总重量不超过w的物品,使其价值最大,求所有方案中价值总和的最大值
1<=n<=100
1<=wi,vi<=100
1<=w<=10000
使用简单的动态规划就可以求出
代码如下所示:
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n,w[101],v[101],dp[10001]={0},W;//dp数组记录当前重量下能存放的最大价值
cin>>n;
for(int i=0;i<n;i++){
cin>>w[i]>>v[i];
}
cin>>W;
for(int i=0;i<n;i++){//将物品循环
for(int j=W;j>=w[i];j--){/*将当前物品挨个尝试是否可以将当前重量下的最大价值提高
这一层循环必须倒循环,因为正循环会将一个物品多次使用*/
dp[j]=max(dp[j-w[i]]+v[i],dp[j]);
}
}
cout<<dp[W]<<endl;
return 0;
}
二、完全背包问题
n个重量和价值分别为wi,vi的物品,从这些物品中挑出总重量不超过w的物品,使其价值最大,求所有方案中价值总和的最大值(