Dividing
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 54064 | Accepted: 13818 |
Description
Marsha and Bill own a collection of marbles. They want to split the collection among themselves so that both receive an equal share of the marbles. This would be easy if all the marbles had the same value, because then they could just split the collection in half. But unfortunately, some of the marbles are larger, or more beautiful than others. So, Marsha and Bill start by assigning a value, a natural number between one and six, to each marble. Now they want to divide the marbles so that each of them gets the same total value. Unfortunately, they realize that it might be impossible to divide the marbles in this way (even if the total value of all marbles is even). For example, if there are one marble of value 1, one of value 3 and two of value 4, then they cannot be split into sets of equal value. So, they ask you to write a program that checks whether there is a fair partition of the marbles.
Input
Each line in the input file describes one collection of marbles to be divided. The lines contain six non-negative integers n1 , . . . , n6 , where ni is the number of marbles of value i. So, the example from above would be described by the input-line "1 0 1 2 0 0". The maximum total number of marbles will be 20000.
The last line of the input file will be "0 0 0 0 0 0"; do not process this line.
The last line of the input file will be "0 0 0 0 0 0"; do not process this line.
Output
For each collection, output "Collection #k:", where k is the number of the test case, and then either "Can be divided." or "Can't be divided.".
Output a blank line after each test case.
Output a blank line after each test case.
Sample Input
1 0 1 2 0 0 1 0 0 0 1 1 0 0 0 0 0 0
Sample Output
Collection #1: Can't be divided. Collection #2: Can be divided.
题意:
有6种大理石,给出每种大理石的数量和价值,用num[ i ](不超过20000)表示,i 代表价值,num[ i ]代表数量。判断是否能平均分成两堆价值一样的大理石。
思路:
多重背包。
AC1:
#include<stdio.h> #include<string.h> #define max 1000000 int dp[500000],val[50000]; int main() { int num[11],time=1; while(scanf("%d%d%d%d%d%d",&num[1],&num[2],&num[3],&num[4],&num[5],&num[6])!=EOF) { int sum=0,half,k=0; dp[0]=0; for(int i=1;i<500000;i++) dp[i]=-max; for(int i=1;i<=6;i++) sum+=num[i]*i; if(!sum) break; printf("Collection #%d:\n",time++); if(sum%2) printf("Can't be divided.\n\n"); else { half=sum/2; for(int i=1;i<=6;i++) { for(int j=1;j<=num[i];j++) val[k++]=j*i,num[i]-=j; if(num[i]>0) val[k++]=num[i]*i; } for(int i=0;i<k;i++) for(int j=half;j>=val[i];j--) if(dp[j-val[i]]+val[i]>dp[j]) dp[j]=dp[j-val[i]]+val[i]; if(dp[half]<0) printf("Can't be divided.\n\n"); else printf("Can be divided.\n\n"); } } return 0; }
AC2比AC1要更省时间。
AC2:
#include<stdio.h> #include<string.h> #define max 1000000 int sum,half; int dp[200000]; void zeroonepack(int value) { for(int i=half;i>=value;i--) if(dp[i]<dp[i-value]+value) dp[i]=dp[i-value]+value; } void completepack(int value) { for(int i=value;i<=half;i++) if(dp[i]<dp[i-value]+value) dp[i]=dp[i-value]+value; } void multipack(int value,int number) { int k=1; if(value*number>half) completepack(value); while(k<number) { zeroonepack(k*value); number-=k; k+=k; } zeroonepack(number*value); } int main() { int num[10]; int time=1; while(scanf("%d%d%d%d%d%d",&num[1],&num[2],&num[3],&num[4],&num[5],&num[6])!=EOF) { sum=0; dp[0]=0; for(int i=1;i<=6;i++) sum+=num[i]*i; if(!sum) break; printf("Collection #%d:\n",time++); if(sum%2) printf("Can't be divided.\n\n"); //如果总价值为单数的时候,无论怎么分都不可能分成平均的两份 else { for(int i=1;i<200000;i++) dp[i]=-max; half=sum/2; for(int i=1;i<=6;i++) //是每一个数都要进行一次01背包 multipack(i,num[i]); if(dp[half]<0) printf("Can't be divided.\n\n"); //输出格式注意 else printf("Can be divided.\n\n"); } } return 0; }
总结:
1.输出格式没看清;
2.总数为单数的情况没考虑仔细;
3.注意数组开的大小。
相关推荐
在给出的文件列表中,“POJ1014-Dividing【多重背包+二进制优化】.cpp”和“POJ1014-Dividing【DFS】.cpp”很可能是两份不同的C++代码实现,分别展示了如何结合多重背包和二进制优化以及如何利用DFS来解决问题。...
"Simple Dividing Number Game" 是一个使用JavaScript编写的数字除法游戏,旨在通过游戏化学习的方式帮助用户提高对数字和除法的理解。这个游戏的核心概念是让玩家面对一系列数学问题,这些问题涉及将一个数字除以另...
Pku acm 第1014题 Dividing c代码,有详细的注释,动态规划
本文探讨的是由路易斯安那州立大学数学系的Joshua Smith和Helena Verrill共同撰写的论文《On dividing rectangles into rectangles》。该论文主要关注如何计算将一个具有整数边长的矩形分割成多个同样具有整数边长的...
c++ C++_leetcode题解之728. Self Dividing Numbers.cpp
标题“Multiplying and Dividing Matrices Element-by-Element”表明我们将学习如何对矩阵的每个对应元素进行运算,而不是对整个矩阵进行运算。描述中的“Matlab Tutorial - 39 - Multiplying and Dividing Matrices...
【标题】"hdoj.rar_Dividing HDOJ_OJ 1082_hdoj 10_杭电oj_杭电oj1000" 涉及的知识点主要围绕着“杭电在线判题系统(HDOJ)”以及其中的题目1082和10系列题目。HDOJ是杭州电子科技大学主办的一个在线编程竞赛平台,...
### 分数除法模型——六年级 #### 评论与引言 分数的除法概念在传统的数学教学中经常被误解且处理不足。在发展出分数除法算法之前,理解分数除法的基本含义对于学生的思维过程至关重要。为了让学生直观地理解和看到...
a high linearized photonic mixer based on unsymmetrical power dividing for ROF system
$ git clone https://github.com/Alladin9393/Search-For-Dividing-Circle.git && cd Search-For-Dividing-Circle $ virtualenv venv -p python3 && source venv/bin/activate $ pip3 install -r requirements.txt ...
html事件改变矩形大小源码 区域1 <div id="dividing-line1"> 区域2 <div id="dividing-line2"> 区域3 </template>
标题中的“Dividing-by-the-number-11”指的是在编程中处理数字除以11的情况。这个主题通常涉及计算和算法,特别是在C语言环境中。在C语言中,我们需要理解整数除法和取模运算的概念,这对于实现这个任务至关重要。 ...
Dividing (分割) - **问题描述**:可能涉及到物品的公平分配问题,确保每个人获得的价值大致相等。 - **算法应用**:贪心算法或动态规划,用于平衡分割问题。 ### BFS练习 #### 1. Rescue (救援) - **问题描述**...
《SWT和JFace开发指南》是一本深入探讨Eclipse RCP(Rich Client Platform)开发技术的专业书籍。这本书主要关注两个关键组件:SWT(Standard Widget Toolkit)和JFace,它们是Eclipse平台中用于构建桌面应用程序的...
4. **简化处理**:相比于 Marching Cubes,Dividing Cubes 的核心优势在于其关注点的渲染而非三角形面片,因此在计算效率和视觉效果方面都更具优势。此外,随着基于点的渲染技术(Points Based Rendering)的兴起,...
QGridLayout lays out widgets in cells by dividing the available space into rows and columns. QFormLayout, on the other hand, sets its children in a two-column form with labels in the left column and ...
YAFFS is a log-structured ...is determined by dividing the file position by the chunk size. Each chunk has a number of valid bytes, which equals the page size for all except the last chunk in a file.
GridLineParams: TDBVertGridLineParamsEh - Color settings of the dividing lines in vertical grid. DataColParams: TDBVertGridDataColParamsEh - The setting of the column with data. LabelColParams: ...
Binary numbers larger than four digits are written with a space dividing each group of four digits, as in 1000 0101 0010b. All other numbers are decimal. Key Words May: Indicates flexibility of choice...