結果
| 問題 |
No.4 おもりと天秤
|
| コンテスト | |
| ユーザー |
C_kumo
|
| 提出日時 | 2019-01-19 01:52:17 |
| 言語 | C (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 2 ms / 5,000 ms |
| コード長 | 1,927 bytes |
| コンパイル時間 | 190 ms |
| コンパイル使用メモリ | 31,104 KB |
| 実行使用メモリ | 5,376 KB |
| 最終ジャッジ日時 | 2024-07-07 13:39:23 |
| 合計ジャッジ時間 | 982 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 23 |
ソースコード
#include <stdio.h>
#include <stdlib.h>
#define POS "possible"
#define IMP "impossible"
#define DEBUG 0
char searchDP(char n,char w[],short sum);
void iniUse(char n,char use[]);
char searchBF(char n,char w[],char use[],short sum,short tmpS);
int compare(const void *a, const void *b)
{
return *(char *)a - *(char *)b;
}
int main(void)
{
char n,i;
char *w,*use;
char ret;
short sum;
scanf("%hhd",&n);
w = (char *)malloc(sizeof(char) * n);
sum = 0;
for (i=0;i<n;i++) {
scanf("%hhd",&w[i]);
sum += w[i];
}
// check even
if (sum % 2 == 1) {
printf("%s\n",IMP);
return 0;
}
sum /= 2;
if (DEBUG) printf("sum = %hd\n",sum);
// sort to ascending
qsort(w,n,sizeof(char),compare);
// check large
if (w[n-1] > sum) {
printf("%s\n",IMP);
return 0;
}
// search brute force
/*
use = (char *)malloc(sizeof(char) * n);
iniUse(n,use);
ret = searchSum(n,w,use,sum,0);
*/
// search DP
ret = searchDP(n,w,sum);
if (ret == 1) {
printf("%s\n",POS);
} else printf("%s\n",IMP);
return 0;
}
char searchDP(char n,char w[],short sum)
{
short i,j;
char *dp;
dp = (char *)malloc(sizeof(char) * n * 100);
dp[0] = 1;
for (i=1;i<n*100;i++) {
dp[i] = 0;
}
for (i=n;i>=0;i--) {
if (DEBUG) printf("w[%hd] = %hhd\n",i,w[i]);
for (j=n*100;j>=0;j--) {
if (dp[j] == 1) {
if (DEBUG) printf("j=%hd\n",j);
if (j+w[i] == sum) return 1;
dp[j+w[i]] = 1;
}
}
}
return 0;
}
void iniUse(char n,char use[])
{
char i;
for (i=0;i<n;i++) use[i] = 0;
return;
}
char searchBF(char n,char w[],char use[],short sum,short tmpS)
{
char i;
char ret;
short tmp;
/*
printf("use= ");
for (i=0;i<n;i++) printf("%hhd ",use[i]);
printf("\n");
*/
for (i=n-1;i>=0;i--) {
if (use[i] == 1) continue;
tmp = tmpS + w[i];
if (tmp > sum) continue;
use[i] = 1;
if (tmp == sum) return 1;
ret = searchBF(n,w,use,sum,tmp);
if (ret == 1) return 1;
use[i] = 0;
}
return 0;
}
C_kumo