天天看點

USACO 3.1 Stamps

#include <stdio.h>
#define DEBUG 1
#define TESTCASES 9
#define MAX_VALUES 50
#define MAX_TOTALVALUE 2000000

int valueArray[MAX_VALUES + 1];
int numOfStamps, numOfValues;
int minStampsArray[MAX_TOTALVALUE + 1];

int main(){
#if DEBUG
	int testCase;
	for (testCase = 1; testCase <= TESTCASES; testCase++){
		char inputFileName[20] = "inputx.txt";
		inputFileName[5] = '1' +  (testCase - 1);
		freopen(inputFileName, "r", stdin);
		printf("\n#%d\n", testCase);
#endif

	scanf("%d%d", &numOfStamps, &numOfValues);
	int i;
	for (i = 1; i <= numOfValues; i++)
		scanf("%d", &valueArray[i]);

	int totalValue = 1;
	int minStamps;
	//周遊每個分值,通過周遊各種郵票來計算貼夠這個分值所需的最少郵票數
	while (1){
		minStamps = 300;
		for (i = 1; i <= numOfValues; i++)
			if (totalValue - valueArray[i] >= 0 && minStampsArray[ totalValue - valueArray[i] ] + 1 < minStamps)
				minStamps = minStampsArray[ totalValue - valueArray[i] ] + 1;
		if (minStamps > numOfStamps)
			break;
		minStampsArray[totalValue] = minStamps;
		totalValue++;
	}

	printf("%d\n", totalValue - 1);	

#if DEBUG
	}
#endif
	return 0;
}
           

繼續閱讀