beibaowenti

揹包問題

時間限制: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

個人理解:將題目所給的各組價值和重量進行排序,然後將其中最大的值與揹包所能承受的最大重量進行比較,如果大於該值,將該值乘以相應的價值,如果小於該值,則將該值減去那一組數據中的最大值,然後該值減去那個最大值,按照上述的方法繼續進行。直到達到揹包能承受的最大重量,從而求出最大價值數。

結果 時間 內存 語言
Accepted 4 240 C
#include<stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    while(n--)//組別非負;
    {
        int v[10],w[10];//將價值和重量定義成兩個數組;
        int s,m,i,j,t1,t2,sum=0;
        scanf("%d %d",&s,&m);
        for(i=0;i<s;i++)
        {
            scanf("%d %d",&v[i],&w[i]);
        }
        for(j=1;j<s;j++)//使用冒泡法排序將價值和重量從大到小進行排序;
            for(i=0;i<=s-j-1;i++)
            {
                if(v[i]<v[i+1])
                {
                    t1=v[i];
                    v[i]=v[i+1];
                    v[i+1]=t1;
                    t2=w[i];
                    w[i]=w[i+1];
                    w[i+1]=t2;
                }
            }
            for(i=0;i<s;i++)
            {
                if(w[i]>=m)
                {
                    sum=sum+m*v[i];
                    break;
                }
                else
                {
                    sum=sum+v[i]*w[i];
                    m=m-w[i];
                }
            }
            printf("%d\n",sum);
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章