http://acm.hdu.edu.cn/showproblem.php?pid=2546
感觉有点贪心在里面。要使饭卡里的钱最少,先对n种菜从小到大排序,m大于5的前提下,先拿出5元钱买最贵的菜,这样会使剩的钱最大程度的少,对剩下的m-5元进行01背包。
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; int main() { int n,m; int cost[1010]; int dp[1010]; while(~scanf("%d",&n) && n) { for(int i = 1; i <= n; i++) scanf("%d",&cost[i]); scanf("%d",&m); memset(dp,0,sizeof(dp)); if(m < 5) { printf("%d\n",m); continue; } sort(cost+1,cost+n+1); int maxn = cost[n]; for(int i = 1; i <= n-1; i++) { for(int j = m-5; j >= cost[i]; j--) { dp[j] = max(dp[j],dp[j-cost[i]] + cost[i]); } } printf("%d\n",m-dp[m-5]-maxn); } return 0; }
hdu 2546 饭卡(01背包变形),布布扣,bubuko.com
原文:http://blog.csdn.net/u013081425/article/details/20130315