Sample Input
2
5 3
1 2 3 4 5
1 1 1 1 1
3 7
1 2 1
3 5 3
Sample Output
12 3
2 6
在virtual judge上刷到的一道题目,几个笔记。
/*
01背包问题
怎么得到最大体积?
*/
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=1005;
int n,V;
int w[N],v[N];
typedef struct node{
int a; //质量
int b; //最大体积
}Int; //随便命了个名
//dp数组用这个结构体的类型,用来解决最大体积的问题
Int dp[N];
int main()
{
int T;
cin>>T;
while(T--){
cin>>n>>V; //输入物品种类和背包容量
for(int i=0;i<n;i++) //物品质量
cin>>w[i];
for(int i=0;i<n;i++) //物品体积
cin>>v[i];
//初始化,边界状态
for(int i=0;i<=V;i++)
dp[i].a=dp[i].b=0;
//01背包核心代码
for(int i=0;i<n;i++)
for(int vv=V;vv>=v[i];vv--){
//dp[vv]=max(dp[vv],dp[vv-v[i]]+w[i]);
if(dp[vv].a>dp[vv-v[i]].a+w[i]){
continue;
}
//记录质量的同时也记录最大体积
else if(dp[vv].a<dp[vv-v[i]].a+w[i]){
dp[vv].a=dp[vv-v[i]].a+w[i];
dp[vv].b=dp[vv-v[i]].b+v[i];
}
else{//==
dp[vv].b=max(dp[vv].b,dp[vv-v[i]].b+v[i]);
}
}
int max_w=0,max_v=0;
for(int i=0;i<=V;i++){
if(dp[i].a>=max_w){ //更新最大质量
max_w=dp[i].a;
max_v=dp[i].b;
}
//质量相同,选体积最大的
else if(dp[i].a==max_v&&dp[i].b>max_v){
max_v=dp[i].b;
}
}
cout<<max_w<<' '<<max_v<<endl;
}
return 0;
}