結果
問題 | No.617 Nafmo、買い出しに行く |
ユーザー |
![]() |
提出日時 | 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=16combination=0 < combination=160000 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 0001i=1 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010i=2 0100 0100 0100 0100 0100 0100 0100 0100 0100 0100 0100 0100 0100 0100 0100 0100i=3 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000iターンが終了したところで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;}