计蒜客 平分娃娃

问题描述

蒜头君酷爱收集萌萌的娃娃。蒜头君收集了 6 种不同的娃娃,第 i 种娃娃的萌值为 i(1≤i≤6)。现在已知每种娃娃的数量 mi,蒜头君想知道,能不能把娃娃分成两组,使得每组的娃娃萌值之和相同。 
输入格式 
输入一行,输入 6 个整数,代表每种娃娃的数量 mi(0≤mi≤20,000)。 
输出格式 
输出一行。如果能把所有娃娃分成萌值之和相同的两组,请输出Can be divided.,否则输出Can’t be divided.。 
样例输入 
2 0 1 1 2 1 
样例输出 
Can’t be divided.
解题思路:先判定萌值是否为偶数,若非,则不能平分;若是,将多重背包问题转化为01背包进行dp求解,是否可以为萌值总和的一半即可

#include
using namespace std;
typedef long long ll;
int m[10];//代表每种娃娃的数量 
int p[1200010];//每种娃娃的萌值 
int k=0,flag=0;
ll sum=0;
ll dp[1200010];
void solve()
{
	for(ll i=1;i<=k;i++){
		for(ll j=sum/2;j>=1;j++){
			if(p[i]<=j){
				dp[j]=max(dp[j-1]+p[i],dp[j-1]);
				if(dp[j]==sum/2){
					flag=1;
					break;
				}
			}
		}
		if(flag) break;
	}
}
int main(){
	for(int i=1;i<=6;i++){//转化为01背包求解 
		scanf("%d",&m[i]);
		sum+=(i*m[i]);
		for(int j=1;j<=m[i];j++){
			p[++k]=i; 
		}
	}
	if(sum%2==1){
		cout<<"Can't be divided."<

 

你可能感兴趣的:(计蒜客,动态规划)