标签:des style blog http color os io strong for
http://poj.org/problem?id=1014
Description
Input
Output
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.
大致题意:
有分别价值为1,2,3,4,5,6的6种物品,输入6个数字,表示相应价值的物品的数量,问一下能不能将物品分成两份,使两份的总价值相等,其中一个物品不能切开,只能分给其中的某一方,当输入六个0是(即没有物品了),这程序结束,总物品的总个数不超过20000
输出:每个测试用例占三行:
第一行: Collection #k: k为第几组测试用例
第二行:是否能分(具体形式见用例)
第三行:空白(必须注意,否则PE)
#include <iostream> #include <stdio.h> #include <string.h> #include <stdlib.h> using namespace std; int dp[1010000],w[101],v[101]; int V,K=0; void wpack(int w) { for(int i=w; i<=V; i++) { if(dp[i-w]+w>dp[i]) dp[i]=dp[i-w]+w; } } void pack1(int w) { for(int i=V; i>=w; i--) { if(dp[i-w]+w>dp[i]) dp[i]=dp[i-w]+w; } } void Mul(int w,int num) { if(w*num>=V) { wpack(w); return ; } int k=1; while(k<num) { pack1(k*w); num-=k; k=k*2; } pack1(num*w); } int main() { while(scanf("%d%d%d%d%d%d",&w[1],&w[2],&w[3],&w[4],&w[5],&w[6])!=EOF) { K++; V=w[1]+w[2]+w[3]+w[4]+w[5]+w[6]; if(V==0) break; V=w[1]*1+w[2]*2+w[3]*3+w[4]*4+w[5]*5+w[6]*6; if(V%2==1) { printf("Collection #%d:\n",K); printf("Can‘t be divided.\n\n"); } else { V=V/2; memset(dp,0,sizeof(dp)); for(int i=1; i<=6; i++) { Mul(i,w[i]); } if(dp[V]==V) { printf("Collection #%d:\n",K); printf("Can be divided.\n\n"); } else { printf("Collection #%d:\n",K); printf("Can‘t be divided.\n\n"); } } } return 0; }
标签:des style blog http color os io strong for
原文地址:http://www.cnblogs.com/zhangmingcheng/p/3940227.html