程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 兩船載物問題

兩船載物問題

編輯:C++入門知識

題目
[html]
題目描述: 
給定n個物品的重量和兩艘載重量分別為c1和c2的船,問能否用這兩艘船裝下所有的物品。 
輸入: 
輸入包含多組測試數據,每組測試數據由若干行數據組成。 
第一行為三個整數,n c1 c2,(1 <= n <= 100),(1<=c1,c2<=5000)。 
接下去n行,每行一個整數,代表每個物品的重量(重量大小不大於100)。 
輸出: 
對於每組測試數據,若只使用這兩艘船可以裝下所有的物品,輸出YES。 
否則輸出NO。 
樣例輸入: 
3 5 8 



3 5 8 



樣例輸出: 
NO 
YES 

題目描述:
給定n個物品的重量和兩艘載重量分別為c1和c2的船,問能否用這兩艘船裝下所有的物品。
輸入:
輸入包含多組測試數據,每組測試數據由若干行數據組成。
第一行為三個整數,n c1 c2,(1 <= n <= 100),(1<=c1,c2<=5000)。
接下去n行,每行一個整數,代表每個物品的重量(重量大小不大於100)。
輸出:
對於每組測試數據,若只使用這兩艘船可以裝下所有的物品,輸出YES。
否則輸出NO。
樣例輸入:
3 5 8
6
3
3
3 5 8
5
3
4
樣例輸出:
NO
YES


思路
最初思路(錯誤)
開始考慮是貪心算法,每次找一個最重的貨物,還寫了個測試代碼:


[cpp]
#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; 

#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代碼
[cpp]
#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
****************************************************************/ 

#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
****************************************************************/


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved