HDU 2546 饭卡 (动态规划01背包)

http://acm.hdu.edu.cn/showproblem.php?pid=2546

先用5元钱买最贵的东西,然后用剩下的钱买价值最大的东西,也就是01背包问题。

先进行排序,找出最大的,然后对剩下的商品进行动态规划,而顺序不影响。

参考博客:http://blog.csdn.net/juststeps/article/details/8714303


#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <stack> 
#include <cstring>
#define eps 1e-8
using namespace std;
int main() {
	//freopen("input.txt","r",stdin);
	int n;
	int price[1010];
	int m;
	int dp[1010];
	while(~scanf("%d", &n) && n) {
		int i, j;
		for(i = 0; i < n; i++) {
			scanf("%d", &price[i]);	
		}
		scanf("%d", &m);
		if(m < 5) {
			printf("%d\n", m);
			continue;
		}
		sort(price, price + n);
		memset(dp, 0, sizeof(dp));
		m -= 5;
		for(i = 0; i < n - 1; i++) {
			for(j = m; j - price[i] >= 0; j--) {
				dp[j] = (dp[j - price[i]] + price[i]) > dp[j] ? (dp[j - price[i]] + price[i]) : dp[j];
			}
		}
		printf("%d\n", m + 5 - price[n - 1] - dp[m]);
	}
	return 0;
}


你可能感兴趣的:(HDU 2546 饭卡 (动态规划01背包))