divide(有趣DP)

divide
【問題描述】
小Y 和他的MM 有一個共同愛好——打彈珠。但是小Y 也遇到了困惑,他和MM 沒有辦法把
他們擁有的彈珠怎麼兩人平分! 但是簡單的數量上的平分沒有辦法滿足MM 的好勝心。MM 要他
們兩人擁有的彈珠價格上相等纔算是公平競爭!
現在告訴你每種價格的彈珠的個數= =!問你能不能把彈珠按照價格平分使得比賽公平!
【輸入格式】
出於小Y 很愛他的MM 所以他們擁有很多很多的彈珠!彈珠總價值多達20000!
不過MM 有戀物癖所以他們只擁有6 種彈珠= =||MM 有戀物癖呀有沒有!有沒有!每種彈珠
的價格是1 2 3 4 5 或者6;
所以輸入數據有六個整數n1,n2,n3,n4,n5,n6 表示價格爲1 2 3 4 5 或者6 的彈珠的數量
每組測試包含n 組數據在第一行給出
【輸出格式】
輸出包含一個字符串,如果可以分割那麼輸出”Can be divided.”,否則輸出”Can’t be divided.”
.
【樣例輸入】
1
1 0 1 2 0 0
【樣例輸出】
Can’t be divided.

題面:給1,2,3,4,5,6,每個數的個數,問他們能不能對半分

做的時候猜想有沒有好的方法可以過大數據,於是猜數論,發現是做夢
老老實實打完全揹包。。。
memcmp(f,0,sizeof(0))
因爲把初始化f數組寫成了以上屁話,這道題就只有八分了哈哈哈

正解
完全揹包
f[i]表示達到i這個數時,每個j(1,2,3,4,5,6)還能用多少個
到最後如果f[sum/2]>=0那麼就可以

80分代碼

#include<bits/stdc++.h>
using namespace std;
int f[200010],n,m,a[10],v[10],w[10];
int main() 
{
	int t;
	scanf("%d",&t);
	while (t--)
	  {
	  	int sum=0;
	  	memset(f,0,sizeof(f));
	  	for (int i=1; i<=6; i++)
	  	{
	  	  scanf("%d",&a[i]);
	      w[i]=i;
	      v[i]=i;
	      sum+=a[i]*i;;
		}
		f[0]=1;
	  	for(int i=1;i<=6;i++)
         for(int j=sum/2;j>=0;j--)
            for(int k=0;k<=a[i];k++)
               if(j-k*v[i]>=0&&f[j-k*v[i]]!=0)
                 f[j]=max(f[j],f[j-k*v[i]]+k*w[i]);
        if (sum%2!=0) puts("Can't be divided."); 
		else 
	    if (f[sum/2]!=0) puts("Can be divided."); 
		else puts("Can't be divided.");
	  }
}

AC

#include<bits/stdc++.h>
#define rep(i,j,k) for((i)=(j);(i)<=(k);++i)
using namespace std;
int T,s,i,j,a[10],f[20005];
int inline read(){
	char ch=getchar();int z=0,f=1;
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){z=z*10+ch-'0';ch=getchar();}
	return z*f;
}
int main(){
	freopen("divide.in","r",stdin);
	freopen("divide.out","w",stdout);
	T=read();
	while(T--){
		s=0; rep(i,1,6) a[i]=read(),s+=i*a[i];
		if(s&1){puts("Can't be divided."); continue;}
		s>>=1; f[0]=0; rep(i,1,s) f[i]=-1;
		rep(i,1,6)
			rep(j,0,s)
				if(f[j]>=0) f[j]=a[i];
				else if(i<=j) f[j]=f[j-i]-1; else f[j]=-1;
		if(f[s]>=0) puts("Can be divided."); else puts("Can't be divided.");
	}
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章