POJ 1384 PigBank

題意:題目的意思是有一個儲蓄罐,裏面放了硬幣,只知道儲蓄罐裝了硬幣和沒裝硬幣時的重量,並且知道每種面值硬幣的重量。現在要求儲蓄罐中可能的最小金額。若儲蓄罐中硬幣的重量和每種面值硬幣的重量不能匹配,則輸出impossible。

分析:這又是一道典型的完全揹包問題,因爲我們可以認爲儲蓄罐中每種面值的錢幣是任意多的。這道題只是把求最大值改爲了求最小值。並且揹包要求完全裝滿。這個時候要注意初始化的時候不能初始爲負無窮而應該是正無窮了。但是我們不能這麼定義:

#define MAX_INT 0x7fffffff

因爲若是這麼定義在計算F[v-cost]+weightF[]會溢出,因爲是做加法,這一點應該特別注意。我們應該定義MAX_INT爲F[]可能的最大值。F[]的含義是前i件物品恰放入一個容量爲v的揹包可以獲得的最小价值。現在v的最大值是10000,錢幣的最輕重量是1,就是說最多可能有10000個錢幣,錢幣的最大面值是50000,也就是說,F[]的最大值是500000000。所以我們應該

#define MAX_INT 500000000

見代碼:

#include <iostream>
using namespace std;

#define MAX_INT 50000000

int F[10001];
int P[501];
int W[501];

int min(int a, int b)
{
	return a<b?a:b;
}

void CompletePack(int cost, int weight, int V)
{
	for (int v=cost; v<=V; ++v) {
		F[v] = min(F[v], F[v-cost]+weight);
	}
}

int main(int argc, char **argv)
{
	int T, a, b, V, n;
	cin>>T;
	while (T--) {
		cin>>a>>b;
		V = b - a;
		cin>>n;
		F[0] = 0;
		for (int i=1; i<=10000; ++i)
			F[i] = MAX_INT;
		for (int i=1; i<=n; ++i) {
			cin>>P[i]>>W[i];
			CompletePack(W[i], P[i], V);
		}
	        

		if (F[V]==MAX_INT)
			cout<<"This is impossible."<<endl;
		else
			cout<<"The minimum amount of money in the piggy-bank is "<<F[V]<<"."<<endl;

	}
	system("pause");
	return 0;
}

110MS過!done!


發佈了29 篇原創文章 · 獲贊 46 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章