几种常见背包模版

 

//01背包
n个体积为c[i],价值为w[i]物品(各一个),装进容量为V的背包,求最大价值:
int dp[N];
sizeof(dp,0,sizeof dp);
for(int i=1;i<=n;i++) 
for(int j=V;j>=v[i];j--)
dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
ans=dp[V];

//完全背包 
n个体积为c[i],价值为w[i]物品(各任意个),装进容量为V的背包,求最大价值:
背包不一定装满: 
int dp[N];
memset(dp,0,sizeof dp);
for(int i=1;i<=n;i++)
for(int j=v[i];j<=V;j++)
dp[j]=max(dp[j],dp[j-v[i]]+w[i]);

背包完全装满:
int dp[N];
memset(dp,-0x3f,sizeof dp);
dp[0]=0;
for(int i=1;i<=n;i++)
for(int j=v[i];j<=V;j++)
dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
ans=dp[V]<0?0:dp[V];

//多重背包:O(n^3)未优化版本 
int dp[N];
for(int i=1;i<=n;i++)
{
	int v,w,s; cin>>v>>w>>s;//体积、价值、个数 
	for(int j=V;j>=0;j--)
    for(int k=1;k<=s&&j>=k*v;k++)
    f[j]=max(f[j],f[j-k*v]+k*w);
}
ans=f[m];

//二维费用背包:
int dp[N][N]
cin>>n>>v>>m;//n个物品,v总体积,m总重量
for(int i=1;i<=n;i++) 
{
	int a,b,c; cin>>a>>b>>c;//体积,重量,价值
	for(int j=v;j>=a;j--) 
	for(int k=m;k>=b;k--)
	dp[i][j]=max(dp[j][k],dp[j-a][k-b]+c);
}
ans=dp[v][m];

//分组背包:
int f[N],v[N],w[N];
cin>>n>>m;//个数、总体积
for(int i=0;i<n;i++) 
{
	int s; cin>>s;//每一组物品数 
	for(int j=0;j<s;j++) cin>>v[j]>>w[j];
	for(int j=m;j>=0;j--)
	for(int k=0;k<s;k++)
	    if(j>=v[k])
	     f[j]=max(f[j],f[j-v[k]]+w[k]);
}
 ans=f[m];
 

24/7/29

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值