/*
两人分石头,要求平分,但石头大小不一,价值也不一样,从1到20000,如果一堆石头的总价是奇数显然不可分,则输出不可分割
否则再看这堆石头是否能被分成两份,在保证石头完好无损的情况下。
输入1 0 1 2 0 0代表价值为1的1个,价值为2的0个,·····;即有四块价值分别为4,4,3,1的石头,显然这石头是没法分的
输入1 0 0 0 1 1代表·····,即有三块价值为6,5,1的石头,显然可分,一份为6,另一份为5,1;
有两种解决方法:
第一种是同学都熟悉的多重背包问题
第二种方法是很少有同学使用的DFS
*/
#include <iostream> #include<stdio.h> #include<string> #include<algorithm> #include<vector> #include<queue> #include<set> #include<map> #include<math.h> #include<limits.h> #include<stdlib.h> using namespace std; bool divided=false; int marble[7]= {0}; void DFS(int value,int target,int pre) { if(divided) return; if(value==target) { divided=true; return; } for(int i=pre; i>=1; i--) { if(marble[i]) { if(value+i<=target) { marble[i]--; DFS(value+i,target,i); if(divided) break; } } } return; } int main() { int pre = 6; int evenValue_of_marble;//石块的均值 int flag = 1; while(true) { int i=1; int value_of_marble = 0;//所有石块的价值 int number_of_marble = 0;//石块的个数 while(i <= pre) { cin >> marble[i]; value_of_marble += marble[i] * i; number_of_marble += marble[i]; i++; } if(number_of_marble > 20000) { break; } if(number_of_marble > 0) { if(value_of_marble % 2 == 0) { evenValue_of_marble = value_of_marble / 2; DFS(0,evenValue_of_marble,pre); if(divided) { cout<<"Collection #"<<flag<<":"<<endl; cout<<"Can be divided."<<endl<<endl; flag++; continue; } else { cout<<"Collection #"<<flag<<":"<<endl; cout<<"Can't be divided."<<endl<<endl; flag++; continue; } } else { cout<<"Collection "<<"#"<<flag<<":"<<endl; cout<<"Can't be divided."<<endl<<endl; flag++; continue; } } else { break; } } return 0; }
POJ之1014
最新推荐文章于 2024-10-06 14:10:45 发布