程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> uva10130 - SuperSale(01背包)

uva10130 - SuperSale(01背包)

編輯:C++入門知識

uva10130 - SuperSale(01背包)


題目:uva10130 - SuperSale(01背包)


題目大意:超市甩賣。有n件商品,每件商品有對應的價值和重量。有一個家族准備去超市買東西,每個人最多每種甩賣商品只能買一件,可以拿很多不同的商品但是要能拿得動。給出每個人能拿得動的最大重量,問這樣的一個家族取采購能夠得到的最大的價值。


解題思路:01背包。 dp【j】 = Max (dp【j】, dp【j - W】 + P);W是商品的重量,P是商品的價值。


代碼:

#include 
#include 

const int N = 10005;
const int maxn = 35;
int dp[maxn];
int object[N][2];

int Max (const int a, const int b) { return a > b ? a: b; }

int main () {

	int t;
	int n, g;
	int w;
	int ans;
	scanf ("%d", &t);
	while (t--) {

		scanf ("%d", &n);
		for (int i = 0; i < n; i++)
			scanf ("%d%d", &object[i][0], &object[i][1]);
		scanf ("%d", &g);

		memset (dp, 0, sizeof (dp));

		for (int i = 0; i < n; i++) 
			for (int j = maxn - 5; j >= object[i][1]; j--)
				dp[j] = Max(dp[j], dp[j - object[i][1]] + object[i][0]);

		ans = 0;
		for (int i = 0; i < g; i++) {

			scanf ("%d", &w);
			ans += dp[w];
		}

		printf ("%d\n", ans);
	}
	return 0;
}




  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved