結果
| 問題 |
No.617 Nafmo、買い出しに行く
|
| コンテスト | |
| ユーザー |
michonz4
|
| 提出日時 | 2019-12-26 14:46:05 |
| 言語 | C (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 66 ms / 2,000 ms |
| コード長 | 1,361 bytes |
| コンパイル時間 | 393 ms |
| コンパイル使用メモリ | 29,568 KB |
| 実行使用メモリ | 5,248 KB |
| 最終ジャッジ日時 | 2024-10-04 05:57:52 |
| 合計ジャッジ時間 | 1,418 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 20 |
ソースコード
/* No.617 Nafmo、買い出しに行く */
/*
arr[]={1, 2, 3, 5};
4種類の値(n)の組み合わせをbitで表現: 2*2*2*2=16
combination=0 < combination=16
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
論理積で1になった部分がそのiターンの重さになる, iターン内のiを合計してk以下なら解答の候補
i=0 0001 0001 0001 0001 0001 0001 0001 0001 0001 0001 0001 0001 0001 0001 0001 0001
i=1 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010
i=2 0100 0100 0100 0100 0100 0100 0100 0100 0100 0100 0100 0100 0100 0100 0100 0100
i=3 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000
iターンが終了したところでiターンの合計値sumとmaxを比較して最大値を保持する
*/
#include <stdio.h>
int main() {
int n, k, arrSize=0;
scanf("%d %d", &n, &k);
int arr[n], t;
for (int i=0; i<n; i++) {
scanf("%d", &t);
if (t<=k) arr[arrSize++]=t;
}
int max=0;
for (int combination=1; combination<(1<<arrSize); combination++) {
int sum=0;
for (int i=0; i<arrSize; i++) {
if (combination&(1<<i)) {
sum+=arr[i];
if (sum>k) break;
}
}
if (sum<=k) max=(max>sum ? max: sum);
}
printf("%d\n", max);
return 0;
}
michonz4