1014:Dividing
問題文
http://poj.org/problem?id=1014
1から6までの価値がついたビー玉を二人で分けたい。
ビー玉の個数が与えられるので同じ価値になるように
わけられるかどうか判定せよ。
動的計画法で解いた。
ビー玉の価値の合計の半分が作れればよい。
個数制限つき部分和問題と同じ。
dp[ビー玉の価値-1][作る価値]:=価値i-1のビー玉の余った個数
#include<iostream> #include<algorithm> using namespace std; int main(void){ int m[7],t=1; while(true){ if(t!=1)cout << endl; int K=0; for(int i=0;i<6;i++)cin >> m[i],K+=m[i]*(i+1); if(K==0)break; if(K%2){ cout << "Collection #" << t << ":" << endl; cout << "Can't be divided." << endl; t++; continue; } K/=2; int dp[120001]; fill(dp,dp+120001,-1); dp[0]=0; for(int i=0;i<6;i++){ for(int j=0;j<=K;j++){ if(dp[j]>=0)dp[j]=m[i]; else if(j<i+1 || dp[j-i-1]<=0)dp[j]=-1; else dp[j]=dp[j-i-1]-1; } } cout << "Collection #" << t << ":" << endl; if(dp[K]>=0)cout << "Can be divided." << endl; else cout << "Can't be divided." << endl; t++; } return 0; }