ZOJ 1149(多重背包)
2015-09-06 20:34
357 查看
Dividing
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 describes one collection of marbles to be divided. The lines consist of six non-negative integers n1, n2, ..., 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.
Output
For each colletcion, 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.
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.
Source
Mid-Central European Regional Contest 1999
多重背包问题~
AC代码:
Time Limit: 2000MS | Memory Limit: 65536KB | 64bit IO Format: %lld & %llu |
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 describes one collection of marbles to be divided. The lines consist of six non-negative integers n1, n2, ..., 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.
Output
For each colletcion, 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.
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.
Source
Mid-Central European Regional Contest 1999
多重背包问题~
AC代码:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define inf 0x7fffffff int a[7],dp[120010]; int sum , v; //01背包 void ZeroOnePack(int cost,int weight,int lim) { for(int i=lim;i>=cost;i--) dp[i]=max(dp[i],dp[i-cost]+weight); } //完全背包 void CompletePack(int cost,int weight,int lim) { for(int i=cost;i<=lim;i++) dp[i]=max(dp[i],dp[i-cost]+weight); } //多重背包 void MultiplePack(int cost,int weight,int amount,int lim) { if(cost*amount>=lim) CompletePack(cost,weight,lim); else { for(int k=1;k<amount;) { ZeroOnePack(k*cost,k*weight,lim); amount-=k; k<<=1; } ZeroOnePack(amount*cost,amount*weight,lim); } } int main() { int cas = 1; while(scanf("%d%d%d%d%d%d",&a[1], &a[2], &a[3], &a[4], &a[5], &a[6]) != EOF) { if(a[1]+a[2]+a[3]+a[4]+a[5]+a[6] == 0) break; printf("Collection #%d:\n",cas++); sum = a[1]+2*a[2]+3*a[3]+4*a[4]+5*a[5]+6*a[6]; if(sum & 1) printf("Can't be divided.\n"); else { memset(dp, 0, sizeof(dp)); v = sum / 2; for(int i = 1;i <= 6;i ++) MultiplePack(i,i,a[i],v); if(dp[v] == v) printf("Can be divided.\n"); else printf("Can't be divided.\n"); } printf("\n"); } return 0; }
相关文章推荐
- 简单的四则运算
- 数的奇偶性
- ACM网址
- 1272 小希的迷宫
- 1272 小希的迷宫
- hdu 1250 大数相加并用数组储存
- 矩阵的乘法操作
- 蚂蚁爬行问题
- 蚂蚁爬行问题
- 求两个数的最大公约数【ACM基础题】
- 打印出二进制中所有1的位置
- 杭电题目---一只小蜜蜂
- HDOJ 1002 A + B Problem II (Big Numbers Addition)
- POJ ACM 1002
- POJ 2635 The Embarrassed Cryptographe
- POJ 3292 Semi-prime H-numbers
- POJ 2773 HAPPY 2006
- POJ 3090 Visible Lattice Points
- HDU 1568
- HDU1290