首页 > 代码库 > UESTC 31 饭卡(Card) --背包问题
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; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。