dp 之硬币问题
来源:互联网 发布:java nio与io的区别 编辑:程序博客网 时间:2024/06/07 02:24
It’s commonly known that the Dutch have invented copper-wire. Two Dutch men were fighting over a nickel, which was made of copper. They were both so eager to get it and the fighting was so fierce, they stretched the coin to great length and thus created copper-wire. Not commonly known is that the fighting started, after the two Dutch tried to divide a bag with coinsbetweenthetwoofthem. Thecontentsofthebagappearednottobeequallydivisible. TheDutch of the past couldn’t stand the fact that a division should favour one of them and they always wanted a fair share to the very last cent. Nowadays fighting over a single cent will not be seen anymore, but being capable of making an equal division as fair as possible is something that will remain important forever... That’s what this whole problem is about. Not everyone is capable of seeing instantly what’s the most fair division of a bag of coins between two persons. Your help is asked to solve this problem. Given a bag with a maximum of 100 coins, determine the most fair division between two persons. This means that the difference between the amount each person obtains should be minimised. The value of a coin varies from 1 cent to 500 cents. It’s not allowed to split a single coin. Input A line with the number of problems n, followed by n times: • a line with a non negative integer m (m ≤ 100) indicating the number of coins in the bag • a line with m numbers separated by one space, each number indicates the value of a coin. Output The output consists of n lines. Each line contains the minimal positive difference between the amount the two persons obtain when they divide the coins from the corresponding bag. Sample Input 2 3 2 3 5 4 1 2 4 6 Sample Output 0 1
#include<iostream>//https://vjudge.net/problem/UVA-562#include<string>#include<string.h>using namespace std;int dp[100000],a[100000];int main(){ int n,t; cin>>t; while(t--) { int sum=0; cin>>n; for(int i=0;i<n;i++) { cin>>a[i]; sum+=a[i]; } memset(dp,0,sizeof(dp)); int c=sum/2; for(int i=0;i<n;i++) for(int j=c;j>=a[i];j--) dp[j]=max(dp[j],dp[j-a[i]]+a[i]); cout<<sum-2*dp[c]<<endl; //当装入的金币在sum/2最少的时候 最优 } return 0;}
阅读全文
0 0
- dp 之硬币问题
- 【dp】最少硬币问题
- DP 换硬币问题
- 硬币问题(DP)
- dp 硬币找零问题
- 硬币问题 经典dp
- 紫书dp 硬币问题
- 硬币问题(经典dp)
- 简单DP之最少硬币问题(多重背包问…
- 硬币组合问题之最少硬币个数
- BToj 1030 硬币问题 【DP-完全背包】
- 入门经典--硬币问题dp递归加递推
- DP-硬币问题(一维)
- DP经典应用(五)硬币问题
- DP入门系列二--DAG之二最短路(硬币问题)
- DAG之硬币问题DP(最长路及其字典序)
- 动态规划之硬币问题
- 动态规划之硬币问题
- 初始化字典的6种方式
- C语言入门:冒泡排序(代码实现,而不是排序方法阐述)
- Android 常用sql笔记之视图创建
- HDU5340 Three Palindromes <Manacher>
- Guarding the Chessboard UVA
- dp 之硬币问题
- 【Java】数组和List打印(System.out.println)的区别
- python中的queue模块简介
- XYNUOJ 问题 G: 找明星
- HPU1415 小ho的01串(字符串,河南省多校连萌(三))
- JDBC学习总结_1_PreparedStatement
- python多线程模块threading学习
- 战神z7m-sl7安装ubuntu14.04LTS系统
- 微服务概述