POJ之1014

/*
兩人分石頭,要求平分,但石頭大小不一,價值也不一樣,從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;
}






發佈了47 篇原創文章 · 獲贊 7 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章