欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

0-1 背包(增强并输出对象编号)

最编程 2024-07-15 11:07:46
...

一个旅行者有一个最多能装 M 公斤的背包,现在有 n 件物品,它们的重量分别是W1,W2,...,Wn,它们的价值分别为C1,C2,...,Cn,求旅行者能获得最大总价值。

输入格式:

第一行:两个整数,M(背包容量,M<=200)和N(物品数量,N<=30);

第2..N+1行:每行二个整数Wi,Ci,表示每个物品的重量和价值。

输出格式:

第一行,一个数,表示最大总价值。

第二行,按从小到大输出物品编号,编号间用一个空格隔开,最后一个数后有一个空格。

输入样例:

10 4
2 1
3 3
4 5
7 9

输出样例:

12
2 4 

样例说明:表示选第2,4两件物品得到最大价值12

输出第几个物体的编号时每个编号后加一个空格

提示:当在1….i中决定选不选第i件物品而价值一样时就不选第i件。

代码:

#include<bits/stdc++.h>
using namespace std;
int w[1005],c[1005],dp[1005][1005],lv[1005][1005];
int main(){
	int m,n;
	cin>>m>>n;
	for(int i = 1;i<=n;i++){
		cin>>w[i]>>c[i];
	}
	for(int i = 1;i<=n;i++){
		for(int j = 1;j<=m;j++){
			if(j<w[i]){
				dp[i][j] = dp[i-1][j];
			}else{
				dp[i][j] = max(dp[i-1][j],dp[i-1][j-w[i]]+c[i]);
				lv[i][j] = dp[i-1][j]>=dp[i-1][j-w[i]]+c[i]? 0:1;
			}
		}
	}
	cout<<dp[n][m]<<endl;
	int num[1005],t = 0;
	for(int i=n,j=m;i>0&&j>0;i--){
			if(lv[i][j]==1){
				num[t++] = i;
				j = j-w[i];
			}
	}
	for(int i = t-1;i>=0;i--){
		cout<<num[i]<<" ";
	}
}

推荐阅读