兩船載物問題

來源:互聯網
上載者:User
題目
題目描述:給定n個物品的重量和兩艘載重量分別為c1和c2的船,問能否用這兩艘船裝下所有的物品。輸入:輸入包含多組測試資料,每組測試資料由若干行資料群組成。第一行為三個整數,n c1 c2,(1 <= n <= 100),(1<=c1,c2<=5000)。接下去n行,每行一個整數,代表每個物品的重量(重量大小不大於100)。輸出:對於每組測試資料,若只使用這兩艘船可以裝下所有的物品,輸出YES。否則輸出NO。範例輸入:3 5 86333 5 8534範例輸出:NOYES
思路最初思路(錯誤)開始考慮是貪心演算法,每次找一個最重的貨物,還寫了個測試代碼:
#include <stdio.h>#include <stdlib.h>int cmp_data(const void *p, const void *q){const int *a = p;const int *b = q;return *b - *a;}int main(void){int i, n, c1, c2, *arr;while (scanf("%d", &n) != EOF) {scanf("%d %d", &c1, &c2);arr = (int *)malloc(sizeof(int) * n);for (i = 0; i < n; i ++)scanf("%d", &arr[i]);qsort(arr, n, sizeof(arr[0]), cmp_data);// 貪心演算法int flag;for (i = 0, flag = 1; i < n; i ++) {if (c1 >= arr[i]) {c1 -= arr[i];} else if (c2 >= arr[i]) {c2 -= arr[i];} else {flag = 0;break;}}if (flag) {printf("YES\n");} else {printf("NO\n");}free(arr);}return 0;}
但是很明顯這種做法是錯誤的,理由就是舉出一個反例:3 5 8 5 4 4正確的思路其實不用考慮兩條船的問題,就考慮一條船最多能帶多少貨物,假設最多帶為w,然後看看總共重量sum - w是否小於第二條船的載重量即可,是個0-1背包問題AC代碼
#include <stdio.h>#include <stdlib.h> int cmp_data(const void *p, const void *q){    const int *a = p;    const int *b = q;     return *a - *b;} int main(void){    int i, j, n, c1, c2, sum, *arr, **dp;     while (scanf("%d", &n) != EOF) {        scanf("%d %d", &c1, &c2);        arr = (int *)malloc(sizeof(int) * (n + 1));        arr[0] = 0;        for (i = 1, sum = 0; i <= n; i ++) {            scanf("%d", &arr[i]);            sum += arr[i];        }                 qsort(arr, n, sizeof(arr[0]), cmp_data);         // 0-1背包        dp = (int **)malloc(sizeof(int *) * (n + 1));        for (i = 0; i <= n; i ++)            dp[i] = (int *)malloc(sizeof(int) * (c1 + 1));         for (i = 0; i <= c1; i ++)            dp[0][i] = 0;        for (i = 0; i <= n; i ++)            dp[i][0] = 0;         for (i = 1; i <= n; i ++) {            for (j = 1; j <= c1; j ++) {                if (arr[i] > j) {                    dp[i][j] = dp[i - 1][j];                } else {                    dp[i][j] = (dp[i - 1][j] > arr[i] + dp[i - 1][j - arr[i]]) ? dp[i - 1][j] : arr[i] + dp[i - 1][j - arr[i]];                }            }        }          if (sum - dp[n][c1] <= c2) {            printf("YES\n");        } else {            printf("NO\n");        }                 free(arr);    }     return 0;}/**************************************************************    Problem: 1462    User: wangzhengyi    Language: C    Result: Accepted    Time:20 ms    Memory:11344 kb****************************************************************/
有個不認識的同學九度oj和我比賽,昨晚剛進入前10今天就被擠出來了!!!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.