揹包問題
- 描述
- 現在有很多物品(它們是可以分割的),我們知道它們每個物品的單位重量的價值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; }