题目挺简单和背包问题差不多的,不过数据量比较大,一开始提交超时了。想了很久也没有优化的头绪。于是就百度了一下,看到了一个很faint的公式,原来输入的数据可以一下子就简化到10~20。
n[i] = n[i] % 10 + 10 (!!!)
不过想不出来为什么?希望高手指点一二了。
Accepted | 1149 | C | 00:00.00 | 388K |
#include<stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXN 400
void solve(int n[])
{
int sum = 0 ,i,j,k;
for (i = 1; i <= 6; i++ )
{
if(n[i] > 10 )
n[i] = n[i] % 10 + 10 ;
sum += i * n[i];
}
if (sum & 1 == 1 )
{
printf("Can't be divided./n" );
return ;
}
sum = sum >> 1 ;
char m[7 ][MAXN];
memset(m,0,sizeof (m));
for (i = 0; i <= 6; i++ )
m[i][0] = 1 ;
for (i = 1; i <= 6; i++ )
for (j = 1; j <= sum; j++ )
for (k = 0; k <= n[i]; k++ )
{
if (j - k * i < 0) break ;
if (m[i - 1][j - k * i] == 1 )
{
m[i][j] = 1 ;
break ;
}
}
if (m[6][sum] == 1) printf("Can be divided./n" );
else printf("Can't be divided./n" );
}
void main()
{
#ifndef ONLINE_JUDGE
freopen("1149.txt","r" ,stdin);
#endif
int n[7],t = 0 ;
while(scanf("%d%d%d%d%d%d",&n[1],&n[2],&n[3],&n[4],&n[5],&n[6]) != EOF && (n[1] | n[2] | n[3] | n[4] | n[5] | n[6]) != 0 )
{
printf("Collection #%d: ",++ t);
solve(n);
printf("/n" );
}
#ifndef ONLINE_JUDGE
fclose(stdin);
#endif
}
#include <stdlib.h>
#include <string.h>
#define MAXN 400
void solve(int n[])
{
int sum = 0 ,i,j,k;
for (i = 1; i <= 6; i++ )
{
if(n[i] > 10 )
n[i] = n[i] % 10 + 10 ;
sum += i * n[i];
}
if (sum & 1 == 1 )
{
printf("Can't be divided./n" );
return ;
}
sum = sum >> 1 ;
char m[7 ][MAXN];
memset(m,0,sizeof (m));
for (i = 0; i <= 6; i++ )
m[i][0] = 1 ;
for (i = 1; i <= 6; i++ )
for (j = 1; j <= sum; j++ )
for (k = 0; k <= n[i]; k++ )
{
if (j - k * i < 0) break ;
if (m[i - 1][j - k * i] == 1 )
{
m[i][j] = 1 ;
break ;
}
}
if (m[6][sum] == 1) printf("Can be divided./n" );
else printf("Can't be divided./n" );
}
void main()
{
#ifndef ONLINE_JUDGE
freopen("1149.txt","r" ,stdin);
#endif
int n[7],t = 0 ;
while(scanf("%d%d%d%d%d%d",&n[1],&n[2],&n[3],&n[4],&n[5],&n[6]) != EOF && (n[1] | n[2] | n[3] | n[4] | n[5] | n[6]) != 0 )
{
printf("Collection #%d: ",++ t);
solve(n);
printf("/n" );
}
#ifndef ONLINE_JUDGE
fclose(stdin);
#endif
}