UESTC 31 饭卡(Card) --背包问题
背包问题。
思路:如果m<5,此时也不能消费,所以此时答案为m
m>=5: 求出背包容量为m-5,买前n-1样便宜的菜(排个序)的最大价值(即最大消费,即消费完后剩余值最接近5)最后减去最大的那个菜的价格,就得到最小的余额。
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; #define N 1007 int dp[N],a[N]; int main() { int n,i,m,v; while(scanf("%d",&n)!=EOF && n) { for(i=1;i<=n;i++) scanf("%d",&a[i]); scanf("%d",&m); memset(dp,0,sizeof(dp)); sort(a+1,a+n+1); if(m<5) { printf("%d\n",m); continue; } for(i=1;i<n;i++) { for(v=m-5;v>=a[i];v--) dp[v] = max(dp[v],dp[v-a[i]]+a[i]); } printf("%d\n",m-dp[m-5]-a[n]); } return 0; }
作者:whatbeg
出处1:http://whatbeg.com/
出处2:http://www.cnblogs.com/whatbeg/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
更多精彩文章抢先看?详见我的独立博客: whatbeg.com