1. 程式人生 > >最優裝載(部分揹包問題,貪心,c++)

最優裝載(部分揹包問題,貪心,c++)

最優裝載
總時間限制: 1000ms 記憶體限制: 65536kB
描述
給定一個最大載重量為M的卡車和N種食品,有食鹽,白糖,大米等(假設它們都是散裝且大貨車只受重量限制不受體積限制)。已知第i種食品的最多擁有Wi公斤,其商品價值為Vi元/公斤,程式設計確定一個裝貨方案,使得裝入卡車中的所有物品總價值最大。

輸入
n+1行
第一行:輸入兩個數分別是貨車的最大載重量m(公斤)和貨物的種類n
接下來n行:每行兩個數,第一個是貨物的擁有量wi公斤,貨物的單價vi元/公斤
1≤m,n,wi,vi≤100
輸出
一個數,最大價值
樣例輸入

100 3
60 90
50 100
40 110

樣例輸出

10300

提示
貪心

思路點拔:本題應使用貪心,貪心思想為:讓每個貨物按從大到小排序,然後儘量
多裝價值大的貨物,而且必須裝滿,好了,思路就這麼簡單,呵呵,上程式碼!!

#include<cstdio>
#include<algorithm>
using namespace std;
struct food{int w,p;}a[105]; //w代表重量,p代表這種貨物的價值
bool cmp(const food &x,const food &y) //按價值的從小到大排序
{
    return x.p>y.p;
}
int main()
{
    int
s,n; scanf("%d %d",&s,&n); //輸入貨車的總載重量與貨物的總數 for(int i=1;i<=n;i++) { scanf("%d %d",&a[i].w,&a[i].p); //輸入貨物的重量與價值 } sort(a+1,a+n+1,cmp); //排序 int price=0; //記錄總價值 for(int i=1;i<=n;i++) { if(s-a[i].w>=0) //如果還能把一種貨物裝完,就全部上 { price+=a[i].w*a[i].p; //累加這種貨物的全部價值
s-=a[i].w; //載重量減去這個貨物總重量 } else //要把貨車裝滿 { price+=s*a[i].p; break; } } printf("%d",price); //輸出總價值 return 0; }

經典的貪心,策略很簡單,也很基礎,不過貪心策略很容易錯,多多注意^_^