1.问题描述与分析
Amy和Ray外出徒步春游,携带了若干件行李,每件行李都有各自的重量(整数)。他们互相关爱,不愿对方比自己更累,想把行李分成重量相当的两份各自携。
#include<iostream>
#include<string>
using namespace std;
int w[101];
int val[101];
int main()
{
int m,sum,i,j;
while(cin>>m)
{
sum=0;
for(i=0;i<m;i++)
{
cin>>w[i];
sum+=w[i];
}
memset(val,0,sizeof(val));
for(i=1;i<=m;i++)
{
for(j=sum/2;j>=0;j--)
{
if(val[j-w[i]]+w[i]>val[j])
val[j]=val[j-w[i]]+w[i];
else
val[j]=val[j];
}
}
cout<<sum-val[sum/2]<<" "<<val[sum/2]<<endl;
}
return 0;
}
题目实际是要求一个整数集合A的一个画风:B1和B2,使元素之间的差最小。
设物品的重量{a1,a2,....,an}之和为W。若将A中物品的重量{a1,a2,.....,an}同时视为这些物品的价值,并设W/2为背包的承重量C,则把这问题转化为一个0-1背包问题。