UVa 562 - Dividing coins
2016-04-05 19:00
369 查看
题意:
若干硬币,分成两份,使其绝对值之差尽量小。
思路:
算出硬币总和,然后把硬币总和的一半设为背包容量,背包能拿到的最大价值即是2个人中其中一个所得到。
然后用01背包的思路。
若干硬币,分成两份,使其绝对值之差尽量小。
思路:
算出硬币总和,然后把硬币总和的一半设为背包容量,背包能拿到的最大价值即是2个人中其中一个所得到。
然后用01背包的思路。
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int Max(int a,int b){ if(a > b)return a; return b; } int main() { #ifndef ONLINE_JUDGE freopen("D:\\acm.txt","r",stdin); #endif // ONLINE_JUDGE int cases,ans; int bags[50010]; int coinNum,coins[200]; cin >> cases; while(cases--){ memset(bags,0,sizeof(bags)); memset(coins,0,sizeof(coins)); ans = 0; int coinSum = 0; /////////////////// cin>>coinNum; for(int i = 0;i < coinNum;i++) { cin >> coins[i]; coinSum += coins[i]; } int half = coinSum / 2;//背包容量设成钱币总数的一半 ///////////// for(int i = 0;i < coinNum;i++){ for(int j = half ;j >= coins[i];j--){ bags[j] = Max(bags[j] , bags[j - coins[i]] + coins[i]); }//01背包 } /////////// if(bags[half] > half)ans = bags[half] - (coinSum - bags[half]); else ans = (coinSum - bags[half]) - bags[half]; cout << ans<<endl; } return 0; }
相关文章推荐
- 用JAVA写的一个简单的图形界面计算器
- UVa 10440 - Ferry Loading II
- UVA 10954 - Add All
- UVa 10020 - Minimal coverage
- UVA 10602 - Editor Nottoobad
- UVa 10026 - Shoemaker's Problem
- UVa 120 - Stacks of Flapjacks
- UVa 11369 - Shopaholic
- UVa 10714 - Ants
- UVa 10148 - Advertisement
- 第五周上机时间项目1(1)
- 第6周项目2(3)画出变量占用的内存及值得变化
- 分治算法--寻找第k大数
- Android图片与内存基础知识
- 数据结构-java与c实现带头结点的单链表
- JAVA实验一程序控制语句和JAVA编译器的使用
- Uva 107 The Cat in the Hat
- C++中的delete和delete[]的区别
- 二叉树的层次遍历
- 树状数组(Binary Indexed Trees,二分索引树)