1. 程式人生 > >NYOJ 貪心演算法 106 揹包問題

NYOJ 貪心演算法 106 揹包問題

揹包問題

時間限制:3000 ms  |  記憶體限制:65535 KB

難度:3

描述

現在有很多物品(它們是可以分割的),我們知道它們每個物品的單位重量的價值v和重量w(1<=v,w<=10);如果給你一個揹包它能容納的重量為m(10<=m<=20),你所要做的就是把物品裝到揹包裡,使揹包裡的物品的價值總和最大。

輸入

第一行輸入一個正整數n(1<=n<=5),表示有n組測試資料;
隨後有n測試資料,每組測試資料的第一行有兩個正整數s,m(1<=s<=10);s表示有s個物品。接下來的s行每行有兩個正整數v,w。

輸出

輸出每組測試資料中揹包內的物品的價值和,每次輸出佔一行。

樣例輸入

1
3 15
5 10
2 8
3 9

樣例輸出

65

這道題與01揹包問題並不一樣。因為這道題的物品時刻以分割的。這樣題就變得很容易了。我們只需對所有物品的價值進行從小到大排序,或從大到小排序,依次讓當前揹包容量減去當前最高價值物品的重量,當物品重量大於當前揹包剩餘容量時,以當前揹包剩餘容量為最終標準。

程式碼如下:

 
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int n,s,m,vw[10][2],x,t,p,i,j,sum,y;
    cin>>n;
    while(n--)
    {
       sum=0;
       cin>>s>>m;
       for(i=0;i<s;i++)
       {
           cin>>vw[i][0]>>vw[i][1];
       }
       for(i=0;i<s;i++)
        for(j=i;j<s;j++)
       {
           if(vw[i][0]>vw[j][0])
           {
               x=vw[i][0];
               y=vw[i][1];
               vw[i][0]=vw[j][0];
               vw[i][1]=vw[j][1];
               vw[j][0]=x;
               vw[j][1]=y;
           }
       }
       t=vw[s-1][1];
       p=m;
       for(i=s-1;i>=0;i--)
       {
           sum=sum+vw[i][0]*t;
           p=p-t;
           if(p>=vw[i-1][1])
           t=vw[i-1][1];
           else
           t=p;
       }
       cout<<sum<<endl;
    }
    return 0;
}