日歷
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
---|
27 | 28 | 29 | 30 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|
統計
- 隨筆 - 30
- 文章 - 0
- 評論 - 51
- 引用 - 0
導航
常用鏈接
留言簿(4)
隨筆分類
隨筆檔案
ACM
搜索
最新評論

閱讀排行榜
評論排行榜
|
這幾天一直在修改這道題,一直都改不對,老是錯誤,提交不成功,我把自己的代碼貼出來讓大家幫忙看看,在這里謝過了!
#include <stdio.h>
#include <string.h>
#include <stdlib.h>


int result[4];
int reNumber, reCount, tie, reMax,stampNumber, customerNumber, count[100]; //result是最終客戶的郵票種類,reCount是客戶郵票總個數,reNumber是客戶不同郵票的個數
//stampNumber是郵票的個數,customerNumber是客戶個數
int GetNumber(int *stamp, int *customer) //獲取郵票 和 客戶信息。
  {
int i, n;
n = 0;
stampNumber = 0;
memset(count, 0 ,sizeof(int)*100);
while(1)
 {
if(scanf("%d", &n) == EOF)
return -1;
if(n == 0)
break;
if(count[n]++ < 5)
stamp[stampNumber++] = n;
}
stampNumber--;
customerNumber = 0;
while(1)
 {
scanf("%d", &n);
if(n == 0)
break;
customer[customerNumber++] = n;
}
customerNumber--;
return 1;
}
int NotSame(int *number,int count, int *m,int *stamp) //求不同一組郵票類別的個數和郵票的最大面值。
  {
int i,j, c,s;
c = 0;
*m = stamp[number[0]];
for(i = 0; i < count; i++)
 {
if( *m < stamp[number[i]])
*m = stamp[number[i]];
s = 0;
for(j = 0; j < i; j++)
 {
if(number[i] == number [j])
 {
s = 1;
break;
}
}
if(0 == s)
c++;
}
return c;
}


void Divide(int sum, int *number, int *stamp,int n, int *count, int same,int start)
  {
int i;
int t;
if( *count > 4 )
return;
else if( sum == 0 && *count <= 4)
 {
same = NotSame(number, *count,&t, stamp);
if( same > reNumber || same == reNumber && reCount > *count || same == reNumber && reCount == *count && reMax < t )
 {
reMax = t;
reCount = *count;
reNumber = same;
for(i = 0; i < *count; i++)
result[i] = number[i];
tie = 0;
}
else if(same == reNumber && reCount == *count && reMax == t)
 {
tie = 1;
}

return;
}
for(i = start; i < n; i++)
 {
sum -= stamp[i];
if(sum >= 0)
 {
number[(*count)++] = i;
Divide(sum, number, stamp, n, count,same,i);
(*count)--;
}
sum += stamp[i];
}
}


int main(int argc, char* argv[])
  {
int stamp[100], customer[100];
int number[4];
int count;
int i,j;
do
 {
memset(stamp, 0, 100*sizeof(int));
memset(customer, 0, 100*sizeof(int));
memset(number, 0 ,4);
if(GetNumber(stamp, customer) == -1)
break;
for(i = 0; i <= customerNumber; i++)
 {
reMax = -1;
memset(result, 0, 4);
reNumber = -1;
count=0;
tie = 0;
Divide(customer[i], number,stamp, stampNumber+1,&count, -1,0);
if( (reNumber != -1) && (tie == 0)) //打印結果。
 {
printf("%d (%d):", customer[i], reNumber);
for(j = 0; j < reCount; j++)
printf(" %d",stamp[result[j]]);
printf("\n");
}
else if((reNumber != -1) && (tie == 1))
 {
printf("%d (%d): tie\n",customer[i], reNumber);
}
else
 {
printf("%d ---- none\n",customer[i]);
}
}
}while(1);
return 0;
}
評論:
-
# re: 求助程序
Posted @ 2008-06-29 18:06
我這里可以運行? vs2008 回復 更多評論
-
# re: 求助程序
Posted @ 2008-06-29 18:18
謝謝你!
程序可以運行,但是提交的時候,提示錯誤,不知道哪里寫的不對。 回復 更多評論
-
# re: 求助程序
Posted @ 2008-06-29 23:56
把程序的注釋多加些,別人才好幫你看,也方便自己看。
整個程序都沒有對輸入數據進行合法性檢查。 整個程序都沒有對緩沖區的溢出進行檢查。 全局變量滿天飛。
回復 更多評論
-
# re: 求助程序
Posted @ 2008-06-30 11:05
謝謝你的批評,我會盡快改掉這些壞習慣! 回復 更多評論
-
# re: 求助程序
Posted @ 2008-06-30 14:12
看起來有點難受! 回復 更多評論
-
# re: 求助程序
Posted @ 2008-07-01 09:36
哈哈,終于提交成功了!我重新寫了一篇,請大家指正!
http://www.shnenglu.com/Leon916/archive/2008/07/01/55006.html 回復 更多評論
|