目录
背包
一、01背包
1.二维
/*二维背包*/
#include<bits/stdc++.h>
using namespace std;
#define MAX 10001
int c[MAX],v[MAX],dp[MAX][MAX];
void solve(){
int n,V;//n为有n件物品,V为容量
cin>>n>>V;
for(int i=1;i<=n;i++) cin>>c[i];//价值
for(int i=1;i<=n;i++) cin>>v[i];//容量
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++){
for(int j=1;j<=V;j++){
if(v[i]<=j){
dp[i][j]=max(dp[i-1][j],dp[i][j-v[i]]+c[i]);
}
}
}
cout<<dp[n][V]<<endl;
}
int main(){
int T;
cin>>T;
while(T--){
solve();
}
return 0;
}
/*
V 0 1 2 3 4 5 6 7 8 9 10
c,v 0 0 0 0 0 0 0 0 0 0 0
(1,5) 0 0 0 0 0 1 1 1 1 1 1
(2,4) 0 0 0 0 2 2 2 2 2 3 3
(3,3) 0 0 0 3 3 3 3 5 5 5 5
(4,2) 0 0 4 4 4 7 7 7 7 9 9
(5,1) 0 5 5 9 9 9 12 12 12 12 14
*/
2.一维
/*一维背包*/
#include<bits/stdc++.h>
using namespace std;
#define MAX 10001
int c[MAX],v[MAX],dp[MAX];
void solve(){
int n,V;//n为有n件物品,V为容量
cin>>n>>V;
for(int i=1;i<=n;i++) cin>>c[i];//价值
for(int i=1;i<=n;i++) cin>>v[i];//容量
memset(dp,0,sizeof(dp));
// for(int i=1;i<=n;i++){
// for(int j=V;j>=1;j--){
// if(v[i]<=j)
// dp[j]=max(dp[j],dp[j-v[i]]+c[i]);
// }
// }
for(int i=1;i<=n;i++){
for(int j=V;j>=v[i];j--){
dp[j]=max(dp[j],dp[j-v[i]]+c[i]);
}
}
cout<<dp[V]<<endl;
}
int main(){
int T;
cin>>T;
while(T--){
solve();
}
return 0;
}
/*
V 0 1 2 3 4 5 6 7 8 9 10
c,v 0 0 0 0 0 0 0 0 0 0 0
(1,5) 0 0 0 0 0 1 1 1 1 1 1
(2,4) 0 0 0 0 2 2 2 2 2 3 3
(3,3) 0 0 0 3 3 3 3 5 5 5 5
(4,2) 0 0 4 4 4 7 7 7 7 9 9
(5,1) 0 5 5 9 9 9 12 12 12 12 14
*/
二、完全背包
/*完全背包*/
#include<bits/stdc++.h>
using namespace std;
#define MAX 10001
int c[MAX],v[MAX],dp[MAX];
int Dp[MAX][MAX];
void solve(){
int n,V;//n为有n件物品,V为容量
cin>>n>>V;
for(int i=1;i<=n;i++) cin>>c[i];//价值
for(int i=1;i<=n;i++) cin>>v[i];//容量
// for(int i=1;i<=n;i++){//二维
// for(int j=1;j<=V;j++){
// if(v[i]<=j){
// Dp[i][j]=max(Dp[i-1][j],Dp[i][j-v[i]]+c[i]);
// }
// else Dp[i][j]=dp[i-1][j];
// }
// }
// cout<<Dp[n][V]<<endl;
for(int i=1;i<=n;i++){//一维
for(int j=v[i];j<=V;j++){
dp[j]=max(dp[j],dp[j-v[i]]+c[i]);
}
}
cout<<dp[V]<<endl;
}
int main(){
int T=1;
//cin>>T;
while(T--){
solve();
}
return 0;
}
三、多重背包
/*多重背包*/
#include<bits/stdc++.h>
using namespace std;
#define MAX 10001
int c[MAX],v[MAX],dp[MAX];
void solve(){
int n,V,len=0;
cin>>n>>V;
for(int i=0;i<n;i++){
int a,b,x;
cin>>a>>b>>x;//a为体积,b为价格
// int t=1;
// while(x>=t){
// v[len]=t*a;//容量
// c[len++]=t*b;//价值
// x-=t;
// t<<=1;//t=t*2;
// }
// if(x){
// v[len]=a*x;
// c[len++]=b*x;
// }
for(int j=1;j<=x;j++){
v[len]=j*a;
c[len++]=j*b;
x-=j;
}
if(x)
{
v[len]=a*x;
c[len++]=b*x;
}
}
for(int i=1;i<=len;i++){
for(int j=V;j>=v[i];j--){
dp[j]=max(dp[j],dp[j-v[i]]+c[i]);
}
}
cout<<dp[V]<<endl;
}
int main(){
int T=1;
//cin>>T;
while(T--){
solve();
}
return 0;
}
4959



被折叠的 条评论
为什么被折叠?



