简单总结一下这几天准备比赛的状态,简直就是心浮气躁啊,还好昨天简单的比赛爆零给了我一个警醒,飘下去迟早得摔啊,就比如这道题,很简单,dp都不用直接dfs就行了,剪枝也写了,深搜也写了,一直wrong answer,心里乱糟糟的,结果就是sum和没有置零,orz~~要快点调整状态,准备比赛,不要给自己留遗憾,fighting!
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;
int a[8];
int sum;
int end;
void dfs(int n,int num);
int main(){
sum = 0;
int t=1;
for(int i=1;i<=6;i++){
scanf("%d",&a[i]);
sum += i*a[i];
}
while(a[1]||a[2]||a[3]||a[4]||a[5]||a[6]){
printf("Collection #%d:\n",t++);
if(sum%2==1){ //和为奇数wrong
printf("Can't be divided.\n");
}
else if(a[1]%2==0&&a[2]%2==0&&a[3]%2==0&&a[4]%2==0&&a[5]%2==0&&a[6]%2==0){ //都为偶数直接可分为两部分
printf("Can be divided.\n");
}
else{ //公倍数为60,可以互相转化
if(a[1]>60){
sum-=a[1]/60*60;
a[1] = a[1]-a[1]/60*60;
}
if(a[2]>30){
sum-=a[2]/30*30*2;
a[2] = a[2]-a[2]/30*30;
}
if(a[3]>20){
sum-=a[3]/20*20*3;
a[3] = a[3]-a[3]/20*20;
}
if(a[4]>15){
sum-=a[4]/15*15*4;
a[4] = a[4]-a[4]/15*15;
}
if(a[5]>12){
sum-=a[5]/12*12*5;
a[5] = a[5]-a[5]/12*12;
}
if(a[6]>10){
sum-=a[6]/10*10*6;
a[6] = a[6]-a[6]/10*10;
}
end = 0;
dfs(6,0);
if(!end){
printf("Can't be divided.\n");
}
else{
printf("Can be divided.\n");
}
}
printf("\n"); //输出格式!!
sum = 0; //其他的都写了,结果错误的原因是这个。remember
for(int i=1;i<=6;i++){
scanf("%d",&a[i]);
sum += i*a[i];
}
}
return 0;
}
void dfs(int n,int num){
if(num==sum/2){
end = 1;
return ;
}
if(n==0){
return ;
}
for(int i=a[n];i>=0;i--){
if(num+i*n<=sum/2){
dfs(n-1,num+i*n);
if(end) return ;
}
}
}