完全背包
有n个重量的价值分别为wi,vi的物品,从这些物品中挑选出总重量不超过W的物品,求所有挑选方案中价值总和的最大值
限制条件
1≤n≤100
1≤wivi≤100
1≤W≤10000
样例
输入
n=3
{w,v}={{3,4},{4,5},{2,3}}
w=7
输出
10(0号物体选1个,2号物体选两个)
三重循环(复杂度nw平方)
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>//关于字符的
using namespace std;
int dp[110][110];//记忆化数组
int n,W;int w[110]={0}; int v[110]={0};
int max(int a,int b){
if(a>b) return a;
else return b;
}
int main(){
cin>>n;
for(int i=0;i<n;i++){
cin>>w[i]>>v[i];
}
cin>>W;
memset(dp,0,sizeof(dp));
for(int i=0;i<n;i++){
for(int j=0;j<=W;j++){
for(int k=0;k*w[i]<=j;k++){//选择多件
dp[i+1][j]=max(dp[i+1][j],dp[i][j-k*w[i]]+k*v[i]);
}
}
}
printf("%d\n",dp[n][W]);
}
优化处理,复杂度(nw)
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>//关于字符的
using namespace std;
int dp[110][110];//记忆化数组
int n,W;int w[110]={0}; int v[110]={0};
int max(int a,int b){
if(a>b) return a;
else return b;
}
int main(){
cin>>n;
for(int i=0;i<n;i++){
cin>>w[i]>>v[i];
}
cin>>W;
memset(dp,0,sizeof(dp));
for(int i=0;i<n;i++){
for(int j=0;j<=W;j++){
if(j<w[i]){
dp[i+1][j]=dp[i][j];
}
else{
dp[i+1][j]=max(dp[i][j],dp[i+1][j-w[i]]+v[i]);
}
}
}
printf("%d\n",dp[n][W]);
}