背包问题总览

01背包
以下代码为各类背包问题代码标准例题答案

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1005;
int w[MAXN];    // 重量 
int v[MAXN];    // 价值 
int f[MAXN][MAXN];  // f[i][j], j重量下前i个物品的最大价值 

int main() 
{
    int n, m;   
    cin >> n >> m;
    for(int i = 1; i <= n; ++i) 
        cin >> w[i] >> v[i];

    for(int i = 1; i <= n; ++i) 
        for(int j = 1; j<=m; ++j)
        {
            //  当前重量装不进,价值等于前i-1个物品
            if(j<w[i]) 
                f[i][j] = f[i-1][j];
            // 能装,需判断 
            else    
                f[i][j] = max(f[i-1][j], f[i-1][j-w[i]]+v[i]);
        }
		
	
	cout<<f[n][m]<<endl;           

    return 0;
}



完全背包1维dp

#include<bits/stdc++.h>
using namespace std;
int n,v;
int tiji[10001];
int jiazhi[10001];
int ans[10001];
int main()
{
	cin>>n>>v;
	for(int i=1;i<=n;i++){
		cin>>tiji[i]>>jiazhi[i];
	}
	
	for(int i=1;i<=n;i++){
		for(int j=0;j<=v;j++){
			if(j>=tiji[i]){
				ans[j]=max(ans[j],ans[j-tiji[i]]+jiazhi[i]);
			}
		}
	}
	
	cout<<ans[v]<<endl;
	return 0;
}

多重背包

#include<bits/stdc++.h>
using namespace std;
int number[200];
int tiji[200];
int jiazhi[200];
int ans[10001];
int n,v;
int main(){
	cin>>n>>v;
	for(int i=1;i<=n;i++){
		cin>>tiji[i]>>jiazhi[i]>>number[i];
	}
	
	for(int i=1;i<=n;i++){
		for(int j=v;j>=tiji[i];j--){
			for(int k=0;k<=number[i];k++){
				if(k*tiji[i]<=j){
					ans[j]=max(ans[j],ans[j-k*tiji[i]]+k*jiazhi[i]);
				}
			}
		}
	}
	
	cout<<ans[v]<<endl;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

就是氧气c

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值