URAL——1005 stone pile

浅浅的花香味﹌ 2022-08-10 18:29 97阅读 0赞

题意:

给你n个石头(1<=n<=20),给出每个石头的重量w[i]( 1<=w[ i ] <= 100000),均分为两堆,求出两堆最小的差距重量,并输出。

这一题有两种解法,一时dfs搜出每种情况,二是动态规划求解问题。

  1. #include<iostream>
  2. #include<stdlib.h>
  3. #define maxn 27
  4. #define INF 20000007
  5. using namespace std;
  6. long n,sum,ans,w[maxn];
  7. void dfs(long dep,long now)
  8. {
  9. if(dep>n)
  10. {
  11. if(ans>abs(now-(sum-now))) ans=abs(now-(sum-now));
  12. return;
  13. }
  14. dfs(dep+1,now);
  15. dfs(dep+1,now+w[dep]);
  16. }
  17. int main()
  18. {
  19. cin>>n;
  20. sum=0;
  21. for(long i=1;i<=n;i++)
  22. {
  23. cin>>w[i];
  24. sum+=w[i];
  25. }
  26. ans=INF;
  27. dfs(1,0);
  28. cout<<ans<<endl;
  29. return 0;
  30. }

复杂度为2^n,因为n值很小,此方法对这一题求解较优

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <cstdlib>
  5. #define N 1000010
  6. int w[22],object[N];
  7. using namespace std;
  8. int main()
  9. {
  10. int n;
  11. while(scanf("%d",&n)==1)
  12. {
  13. int sum=0,half,i,j;
  14. for(i=1;i<=n;i++)
  15. {
  16. scanf("%d",&w[i]);
  17. sum+=w[i];
  18. }
  19. half=sum/2;
  20. for (i=1;i<=n;i++)
  21. {
  22. for (j=half;j>=w[i];j--)
  23. object[j] = max(object[j], object[j-w[i]]+w[i]);
  24. }
  25. cout<<sum-object[half]*2<<endl;
  26. }
  27. return 0;
  28. }

复杂度在重量很大的情况下同样达百万级别,但是因为开数组浪费了内存。关于动态规划01背包问题,推荐看一下

《背包问题九讲》http://love-oriented.com/pack/Index.html#sec4

发表评论

表情:
评论列表 (有 0 条评论,97人围观)

还没有评论,来说两句吧...

相关阅读

    相关 A. Stones

    [A. Stones][] 题意:有三堆石头a b c,让你拿石头,问他最多能拿多少石头。 拿石头规则:1.从a堆拿1个,必须从b堆拿两个。 2.从b堆拿1个,必须从c

    相关 ZROI#1005

    [ZROI\1005][ZROI_1005] 非常令人迷惑的一个题... 首先,我们发现,那个\\(M\\)并没有什么卵用. 于是我们直接不鸟它. 然后我们发现我

    相关 URAL--1007 codewords

    三种信息传递过程中可能出错的方式,让你恢复原来正确的信息。 我用的是分类暴搜,用字符串模拟的,这里还是是可行的,不过debug快坑死了o(╯□╰)o...... 后面还有一

    相关 hdu1005

    //两种方法,本以为会时间超限超限,就用数组将结果储存起来,没想到不用优化,直接ac了,判的有点松 \include <iostream>   using name

    相关 URAL 1029

    题目大意:M层N列的矩阵(各元素均为正整数),找出一个路径从第一层到达第M层,使得路径上的所有数的和是所有可达路径中最小的,每次上到下一层以后就不能再上去,依次输出路径上的各点