描述
現在有很多物品(它們是可以分割的),我們知道它們每個物品的單位重量的價值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
-
其實這道題看的時候沒有認真讀題,錯以爲是有好幾個同樣的物品可以放進揹包,以致我不會做題了
-
後老才發現那價值是各個物品的戴維重量的價值 這樣一看題目就更不難了 以此來提醒我自己 要好好讀題!!!!
-
-
<pre name="code" class="cpp">#include <stdio.h> struct Beibao { int v;//題意中v爲每個物品的單位重量的價值 int w;//每個物體的總重量 }; int main() { int k; Beibao a[11],t; scanf("%d",&k); while(k--) { int s,m; scanf("%d%d",&s,&m);//s爲物品件數 m爲總限重 int i,j; for(i=0;i<s;i++) scanf("%d%d",&a[i].v,&a[i].w); for(i=0;i<s-1;i++) for(j=i+1;j<s;j++) { if(a[i].v<a[j].v) { t=a[i]; a[i]=a[j]; a[j]=t; } } int x=0,y=0; for(i=0;i<s;i++) { if((x+a[i].w)<m) { x=x+a[i].w; y=y+a[i].w*a[i].v; } else { y=y+(m-x)*a[i].v;//重量加起來不超過限重的就直接計算價值 超過或等於了就分隔算一下在原來價值的基礎上又能增加多少 求總和即可 break; } } printf("%d\n",y); } return 0; }