結果
| 問題 |
No.4 おもりと天秤
|
| コンテスト | |
| ユーザー |
mudbdb
|
| 提出日時 | 2015-06-11 23:46:18 |
| 言語 | C90 (gcc 12.3.0) |
| 結果 |
AC
|
| 実行時間 | 3 ms / 5,000 ms |
| コード長 | 1,029 bytes |
| コンパイル時間 | 386 ms |
| コンパイル使用メモリ | 21,760 KB |
| 実行使用メモリ | 5,376 KB |
| 最終ジャッジ日時 | 2024-06-26 09:13:18 |
| 合計ジャッジ時間 | 1,191 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 23 |
コンパイルメッセージ
main.c: In function ‘main’:
main.c:31:3: warning: ignoring return value of ‘scanf’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
31 | scanf("%d", &N);
| ^~~~~~~~~~~~~~~
main.c:33:23: warning: ignoring return value of ‘scanf’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
33 | for (i=0; i<N; i++) scanf("%d", &(W[i]));
| ^~~~~~~~~~~~~~~~~~~~
ソースコード
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int N;
int *W;
int Sum = 0;
int Possible = 0;
int **DP = 0;
void go(int w_no, int sum)
{
if (Possible == 0) {
if (DP[w_no][sum] == 0) {
if (w_no < N) {
if ((sum + W[w_no]) == Sum/2) {
Possible = 1;
} else if ((sum + W[w_no]) < Sum/2) {
go(w_no+1, sum + W[w_no]);
go(w_no+1, sum);
} else if (sum < Sum/2) {
go(w_no+1, sum);
}
}
DP[w_no][sum] = 1;
}
}
return;
}
int main()
{
int i;
scanf("%d", &N);
W = (int*)malloc(sizeof(int)*N);
for (i=0; i<N; i++) scanf("%d", &(W[i]));
for (i=0; i<N; i++) Sum += W[i];
if (Sum%2 == 0) {
int *work = (int*)malloc(sizeof(int)*(N+1)*(Sum/2+1));
memset(work, 0, sizeof(int)*(N+1)*(Sum/2+1));
DP = (int**)malloc(sizeof(int*)*(N+1));
for (i=0; i<=N; i++) DP[i] = work+(Sum/2+1)*i;
go(0, 0);
}
if (Possible == 1) {
printf("possible\n");
} else {
printf("impossible\n");
}
return 0;
}
mudbdb