背包問題
時間限制: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
- 第一行輸入一個正整數n(1<=n<=5),表示有n組測試數據;
/*動態規劃求解*/
#include "stdio.h"
#define MAXN 10+2
int map[MAXN][2]; //商品,單位價值(v) 與重量(w)int main()
{int n,result,s,m; //s表示物品個數,m表示能容納的重量 ,10<=m<=20scanf("%d",&n);if(n<1) return 0;while(n--){result=0;scanf("%d %d",&s,&m); for(int i=0;i<s;i++){scanf("%d %d",&map[i][0],&map[i][1]);}int count=0; //包裝物品的重量 while(1){int index=-1,max_value=0; //最大價值的物品 for(int i=0;i<s;i++){if(map[i][0]>max_value) { max_value=map[i][0]; index=i; }} if(count>=m || index==-1) break; //不可再裝包 if(m-count>=map[index][1]){count+=map[index][1]; result+=map[index][0]*map[index][1]; map[index][0]=0; //沒有物品價值為 0 }else{result+=(m-count)*map[index][0]; map[index][1]-=(m-count); break; //包裝滿 } } printf("%d\n",result); }return 0;
}