zzuli-1788(dp)

http://acm.zzuli.edu.cn/problem.php?id=1788

很有意思的一道题,当时周赛没写出来。。。。。

这是道背包题,思路想出来了就是裸的背包,想不出来那就是。。。不会做呗。

要求两份相差最小。

一开始想的用贪心做,错了。

那么说用背包咋做,先将所有的价值加起来sum,然后除以2得sum1,sum2=sum-sum1,那么现在abs(sum1-sum2)是不是就是最小了,

那后以sum1为背包的容量,物品的价值既是价值又是体积,然后直接用一维01背包就行了,就是将一个背包装的尽量满,那么另一个值sum-dp[sum1],就会和dp[sum1]越接近.

最后abs(2*dp[sum1]-sum),就为结果。

 1 #include<stdio.h>
 2 #include<algorithm>
 3 #include<stdlib.h>
 4 #include<iostream>
 5 #include<string.h>
 6 #include<math.h>
 7 using namespace std;
 8 int dp[50000]= {0};
 9 int main(void)
10 {
11     int a[200];
12     int n,i,j,k,p,q;
13     scanf("%d",&n);
14     while(n--)
15     {
16         scanf("%d",&k);
17         int sum=0;
18         memset(dp,0,sizeof(dp));
19         for(i=0; i<k; i++)
20         {
21             scanf("%d",&a[i]);
22             sum+=a[i];
23         }
24         int mm=sum;
25         sum=sum/2;
26         for(i=1; i<=k; i++)
27         {
28             for(j=sum; j>=a[i-1]; j--)
29             {
30                 dp[j]=max(dp[j],dp[j-a[i-1]]+a[i-1]);
31             }
32         }
33         mm-=dp[sum];
34         printf("%d\n",abs(mm-dp[sum]));
35     }
36     return 0;
37 }
时间: 2024-12-16 10:38:24

zzuli-1788(dp)的相关文章

zzuli 1868: UP UP UP!(dp)

严格上升子序列个数; #include <cstdio> #include <cstring> #define N 110 typedef long long LL; LL a[N], dp[N][N]; const int MOD = 1000000000 + 7; //dp[i][j] 以i结尾长度为j的严格递增子序列长度 ; int main() { int Q =1; int t; scanf("%d", &t); while(t--) { in

zzuli 1875多线DP

1875: 蛤玮的财宝 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 530  Solved: 116 SubmitStatusWeb Board Description 蛤玮和他的妹子出海游玩,不小心遭遇了海难,他们醒来之后发现自己到了一座金银岛.岛主非常好心的告诉他们在岛的另一边有船可以送他们回家. 这座岛可以看成n*m的矩阵,蛤玮他们在位置(1,1),而船在位置(n,m).蛤玮发现金银岛遍地都是金子,每个格子里有价值a[i,j]的金子,他和妹

zzuli 2172 队列优化dp

2172: GJJ的日常之购物 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 9  Solved: 8 SubmitStatusWeb Board Description 一天,GJJ去购物,来到商场门口,GJJ计划要买n个商品,第i个商品的坐标为(xi,yi),重量是wi. GJJ比较任性,想按照商品编号从小到大的顺序将所有的商品的搬到车里(车在(0,0)的位置): GJJ可以几个商品一起搬,但在任何时候GJJ手中的商品重量不能超过最大载重C.

zzuli-1739: DP(区间dp)

http://acm.zzuli.edu.cn/problem.php?id=1739 自家学校OJ上的题. 一个区间dp和我上一篇博文写的区间dp基本上一样, 直接上状态转移方程dp[i][j]=min(dp[i][k]+dp[k][j]+a[i]*a[k]*a[j],dp[i][j]); 思路和上一篇基本一样,状态方程表达的意思也一样,具体参考上一篇.比较懒,不写了.... 1 #include<stdio.h> 2 #include<string.h> 3 const int

树形DP [HDU 2196] Computer

Computer Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3526    Accepted Submission(s): 1788 Problem Description A school bought the first computer some time ago(so this computer's id is 1). D

zzuli 1430 多少个0

https://acm.zzuli.edu.cn/zzuliacm/problem.php?id=1430 1430: 多少个0 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 322  Solved: 82 SubmitStatusWeb Board Description 一个n*n的方格,每个格子中间有一个数字是2或者5,现在从方格的左上角走到右下角,每次只能选择向下或者向右移动一格两种移动方式,让所有经过的格子中的数字相乘,求使最后的结果中末

pyoj61 双线DP

传纸条(一) 时间限制:2000 ms  |  内存限制:65535 KB 难度:5 描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的是,他们可以通过传纸条来进行交流.纸条要经由许多同学传到对方手里,小渊坐在矩阵的左上角,坐标(1,1),小轩坐在矩阵的右下角,坐标(m,n).从小渊传到小轩的纸条只可以向下或者向右传递,从小轩传给小渊的纸条只可以向上或者

HDU 5542 The Battle of Chibi dp+树状数组

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5542 题意:给你n个数,求其中上升子序列长度为m的个数 可以考虑用dp[i][j]表示以a[i]结尾的长度为j的上升子序列有多少 裸的dp是o(n2m) 所以需要优化 我们可以发现dp的第3维是找比它小的数,那么就可以用树状数组来找 这样就可以降低复杂度 #include<iostream> #include<cstdio> #include<cstring> #include

hdu 1207 汉诺塔II (DP+递推)

汉诺塔II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4529    Accepted Submission(s): 2231 Problem Description 经典的汉诺塔问题经常作为一个递归的经典例题存在.可能有人并不知道汉诺塔问题的典故.汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下往