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;
}