/*
兩人分石頭,要求平分,但石頭大小不一,價值也不一樣,從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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.