第二篇博客。我又来刷存在感了。
这是一道老题,只不过现在有一些变化,以前要求输入多组数据,现在默认只输入一组。不过这不是这题的重点。所用的算法都一样。
这一题花了我不少时间,然而我还是没有得满分。得了满分的dalao教教我吧。
不过得分不重要 (反正我XDOJ只剩3题没得满分,要是老师说我态度不认真就太扯了吧),重要的是搞懂这题所涉及的一个重要算法:0-1背包。
关于这个算法网上有很多精彩的解释,我这个萌新就不乱说了。(不过为了对得起这篇博客,我尽力详细地说一下)
关于这个题目网上也有很多解释,但我觉得他们的解释不到位。害得我花了大量时间看懂他们的博客。
虽然这题用的是0-1背包算法,但这题有一个特殊的地方,物品的价值在作为价值的同时也作为物品的重量。没看懂?我马上就解释一波。
同样,以防万一,贴一下题目。
标题
分配宝藏
类别
综合
时间限制
2S
内存限制
256Kb
问题描述
两个寻宝者找到一个宝藏,里面包含n件物品,每件物品的价值分别是W[0],W[1],…W[n-1]。
SumA代表寻宝者A所获物品价值总和,SumB代表寻宝者B所获物品价值总和,
请问怎么分配才能使得两人所获物品价值总和差距最小,
即两人所获物品价值总和之差的绝对值|SumA - SumB|最小。
也就是要使得其中一人所获物品价值与所有物品总价值的二分之一之差最小
因此可以将所有物品总价值的二分之一作为背包容量
此时物品的价值在作为价值的同时也作为物品的重量,因为挑选出来的物品的总价值不能超过所有物品总价值的二分之一,即挑选出来的物品的总重量不能超过背包容量
输入说明
输入数据由两行构成:
第一行为一个正整数n,表示物品个数,其中0<n<=200。
第二行有n个正整数,分别代表每件物品的价值W[i],其中0<W[i]<=200。
输出说明
对于每组数据,输出一个整数|SumA-SumB|,表示两人所获物品价值总和之差的最小值。
输入样例
4
1 2 3 4
输出样例
0
自从有一次把C++代码提交到XDOJ上编译错误后,我就再也没有用C++写XDOJ的题了。
#include<stdio.h>
#include<stdlib.h>
int dp[201][20001]={
}; //用一维数组不利于理解(准确的说是连我自己都晕了,手动滑稽*5)
int main()
{
int n;
int w[201]={
};
int sum=0;</