XDOJ-分配宝藏

————————————
隔了段时间,又开始发了。因为这个代码值得我记录一下?
毕竟只有20行嘛(把注释去掉后)。然后也是最近遇到了DFS和背包的动态规划的问题,头有点秃。
然后今天没做多久就写出来了,我觉得最大的帮助,应该是来自B站上up主秒懂算法的视频“【动态规划】背包问题”,感觉非常清晰啦!
这题感觉是真的不难。
————————————

问题描述

两个寻宝者找到一个宝藏,里面包含n件物品,每件物品的价值分别是W[0],W[1],…W[n-1]。
SumA代表寻宝者A所获物品价值总和,SumB代表寻宝者B所获物品价值总和,请问怎么分配才能使得两人所获物品价值总和差距最小,即两人所获物品价值总和之差的绝对值|SumA- SumB|最小。

输入说明

输入数据由两行构成: 第一行为一个正整数n,表示物品个数,其中0 第二行有n个正整数,分别代表每件物品的价值W[i],其中0

输出说明

对于每组数据,输出一个整数|SumA-SumB|,表示两人所获物品价值总和之差的最小值。

输入样例

4
1 2 3 4

输出样例

0

#include 
int dp[205][20005]={
     0};
int main(){
     
	int v_w[205]={
     0};
	int n,i,j,sum=0,sumA;
	//输入物品价值、容量、顺便计算一下总价值
	scanf("%d",&n);
	for(i=1;i<=n;i++){
         
		scanf("%d",&v_w[i]);
		sum+=v_w[i];
	}
	
	for(i=1;i<=n;i++){
     //背包的算法
		for(j=1;j<=(sum/2);j++){
     
			if(v_w[i]>j)dp[i][j]=dp[i-1][j];
			else dp[i][j]=(dp[i-1][j]>dp[i-1][j-v_w[i]]+v_w[i])?dp[i-1][j]:dp[i-1][j-v_w[i]]+v_w[i];
			//printf("dp[%d][%d]:%d ",i,j,dp[i][j]);
		}
	//	printf("\n");
	}//这两个printf语句我还保留在这里,是因为它可以打印出非常整齐的表格(滑稽
	if((sum-2*sumA)>0)printf("%d",(sum-2*dp[n][sum/2]));
	else printf("%d",-(sum-2*dp[n][sum/2]));//绝对值问题
	return 0;
}
 

你可能感兴趣的:(C语言,c语言)