切换到宽版
  • 11389阅读
  • 12回复

帮帮忙吧!各位老虾、大牛! [复制链接]

上一主题 下一主题
离线121371490
 
只看楼主 倒序阅读 0 发表于: 2007-11-08
苹果的分配

Time Limit:1000MS  Memory Limit:65536K

Description
有两个人数分别是s1和s2的班级。有一天他们去果园选苹果,苹果是放在一个个框里面的,任何两框的苹果数都不同,管理员叔叔要求他们必须整框拿走,并且每个班只能拿走两框。已知有n框苹果及每框的苹果数,在保证同班同学分得苹果个数一样多的情况下(两个班各自分配苹果,且分配后不得有剩余),他们可以根据各个框中的苹果数来确定取走哪些装着苹果的框。这样取法可能就不只一种了,问有多少种不同的取法?

Input
第一行为两个班的人数(1≤s1,s2≤70),第二行是框数n(n≤40),第三行n个数表示每框的苹果数(≤300),各个数据间都用一个空格隔开。

Output
一行,不同取法总数(没有一种取法满足要求输出零)

Sample Input
41 42
4
11 30 22 20

Sample Output
1

虽然我知道我的程序比较弱智,但是我知道:输入样例过得了,可是就是过不了测试,各位大虾老牛,帮忙看看那里有问题,如果有更好的解法那就再好不过了!就谢谢各位啦!

var
    a:array[1..40]of integer;
    x:array[1..4]of integer;
    b,c,d,e,i:integer;
procedure s(o,p,q:integer);
var
    i,j:integer;
begin
    for i:=o to p do
    begin
          x[q]:=a;
          if q<4 then s(o+1,p+1,q+1)
                else if q=4 then
                begin
                      if ((x[1]+x[2])mod b=0)and((x[3]+x[4])mod c=0) then e:=e+1;
                      if ((x[1]+x[3])mod b=0)and((x[2]+x[4])mod c=0) then e:=e+1;
                      if ((x[1]+x[4])mod b=0)and((x[3]+x[2])mod c=0) then e:=e+1;
                      if ((x[2]+x[3])mod b=0)and((x[1]+x[4])mod c=0) then e:=e+1;
                      if ((x[4]+x[2])mod b=0)and((x[3]+x[1])mod c=0) then e:=e+1;
                      if ((x[3]+x[4])mod b=0)and((x[1]+x[2])mod c=0) then e:=e+1;
                end;
    end;
end;
begin
    readln(b,c);
    readln(d);
    for i:=1 to d do
          read(a);
    e:=0;
    s(1,d-3,1);
    writeln(e);
end.
离线大壮
只看该作者 1 发表于: 2007-11-09
#include<stdio.h>
typedef struct
{
        short int fir;
        short int sec;
}count;
int main()
{
    int s1,s2,n,i,j,k = 0,m = 0,p = 0;
    int basket[40],state[780];
    count cnt1[780],cnt2[780];
    int ans = 0;
   
    scanf("%d %d",&s1,&s2);
    scanf("%d",&n);
    for(i = 0;i < n;i++) scanf("%d",&basket);
    for(i = 0;i < n - 1;i++)
          for(j = i+1;j < n;j++) {
                state[k] = basket + basket[j];
                if(state[k] % s1 == 0) {
                            cnt1[m].fir = i;
                            cnt1[m].sec = j;
                            m++;
                            }
                if(state[k] % s2 == 0) {
                            cnt2[p].fir = i;
                            cnt2[p].sec = j;
                            p++;
                            }
                k++;
                }
    for(i = 0;i < m;i++) {
          for(j = 0;j < p;j++) {
                if((cnt1.fir ^ cnt2[j].fir)&&(cnt1.sec ^ cnt2[j].sec)&&(cnt1.fir ^ cnt2[j].sec)&&(cnt1.sec ^ cnt2[j].fir))
                                ans++;
                }
          }
    printf("%d",ans);
    return 0;
}
离线大壮
只看该作者 2 发表于: 2007-11-09
lz的程序没看懂?啥意思啊?晕啊~~
离线121371490
只看该作者 3 发表于: 2007-11-09
不好意思,
我学的是Pascal,
看不懂你的C++程序,
不过还是感谢你!
离线faraway
只看该作者 4 发表于: 2007-11-09
不是就4框苹果lz!!
当然要用循环了!!!
对于这道题4重循环都不会超的!!
所以直接四重循环就OK了
离线空泽木
只看该作者 5 发表于: 2007-11-10
额..我也觉得奇怪了。.怎么..连n也没定义..郁闷。..原来..LZ以为..是4筐了。.郁闷....LZ.你再仔细..读读题目哈....
离线sm-star
只看该作者 6 发表于: 2007-11-10
moni
离线121371490
只看该作者 7 发表于: 2007-11-10
怎么听不懂呢?
离线ddddddd
只看该作者 8 发表于: 2007-11-11
离线faraway
只看该作者 9 发表于: 2007-11-11
8楼的程序不对吧??还是4个筐的思想!!!
题目要求n个筐!!!
属于4重循环深搜问题!!
快速回复
限100 字节
 
上一个 下一个