题目链接:http://acm.ocrosoft.com/problem.php?cid=1222&pid=28
题目描述
有一n个石头,它们的重量分别是 W1, …, Wn.
写一个程序,把它们分成两堆,使得两堆石头的重量差最小。
输入
输入 n (1 ≤ n ≤ 20)表示石头的个数。
第二行n个石头的重量 W1, …, Wn ( 1 ≤ Wi ≤ 100000)
输出
输入最小的差(绝对值)
样例输入
5
5
8
13
27
14
样例输出
3
可以用dfs搜索来做也可以转化为背包问题,题目要求两堆石头的重量差值最小,所以要把石头总重量的一半作为背包的一半,求出这个背包能放下的最大重量,此题它的价值和重量是相同的。
#include<bits/stdc++.h>
using namespace std;
int n;
int cost[22];
int dp[111111];
int main(){
while(cin>>n){
int sum=0;
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++){
cin>>cost[i];
sum+=cost[i];
}
//用总重量的一半作为背包的容量,找这个背包能装下的最大值 相减后即差值最小
for(int i=1;i<=n;i++){
for(int j=sum/2;j>=cost[i];j--){
dp[j]=max(dp[j],dp[j-cost[i]]+cost[i]);
}
}
cout<<sum-dp[sum/2]*2<<endl;
}
}