HDU 2546 饭卡(0-1背包)
来源:互联网 发布:阿尔法拆单软件 编辑:程序博客网 时间:2024/05/16 01:55
http://acm.hdu.edu.cn/showproblem.php?pid=2546
这仍然是一个 0-1背包 的问题 和上一题 2602 类似。思路是:在饭卡的余额大于等于5时 我们可以买下任意价值的菜 所以我们只需要 在饭卡的余额小于五之前买下价值尽可能多的菜 然后 再买下价值最大的菜即可
AC代码:
#include <stdio.h> #include <string.h> #include <stdlib.h> int cmp(const void *a,const void *b){ return *(int *)a-*(int *)b; } int max(int a,int b){ return a>b?a:b; } int dp[1005][1005]; int main (){ int n; int v; int num[1005]; while (scanf("%d",&n)&&n) { for (int i=1;i<=n;i++) scanf ("%d",&num[i]); scanf ("%d",&v);//饭卡的金额 memset(dp,0,sizeof(dp)); if (v<5)//如果饭卡的金额小于5 不能买 printf ("%d\n",v); else//大于等于5可以买 { qsort(num+1,n,sizeof(num[0]),cmp); //升序排列 留下最大的一个 // 找出在 v-5 的余额下能买到的菜的最大价值 for (int i=1;i<n;i++) { for (int j=0;j<=v-5;j++)// v-5 表示给饭卡留下五块钱来买价值最大的菜 { if (num[i]<=j) { dp[i][j]=max(dp[i-1][j],dp[i-1][j-num[i]]+num[i]);// 状态转移方程 用来判断选取 是否牺牲余额买下该物体 } else{ dp[i][j]=dp[i-1][j]; } } } printf ("%d\n",v-dp[n-1][v-5]-num[n]); } } return 0; }
0 0
- HDU 2546 饭卡(0-1背包)
- HDU 2546----饭卡(0-1背包)
- hdu 2546 饭卡(0-1背包)
- HDU 2546 饭卡(0-1背包)
- hdu 2546 饭卡(0/1背包)
- HDU 2546 饭卡 (0/1背包问题)
- 【0-1背包】-HDU-2546-饭卡
- HDU 2546 饭卡 0-1背包
- hdu-2546-饭卡-0-1背包
- HDU ACM 2546 饭卡->0-1背包
- HDU 2546(饭卡)0-1背包问题
- hdu 2546 饭卡(0-1背包)
- hdu 2546 饭卡(0-1背包问题)
- HDU/HDOJ 2546 饭卡(DP,0/1背包)
- HDU 2546 饭卡(0/1背包变形)
- hdu 2546 饭卡(背包)
- HDU 2546 饭卡(背包)
- 【HDU-2546】饭卡(背包)
- request.getParameter() 和request.getAttribute() 区别
- 这一次,让我们来好好聊聊Java泛型
- JAVA: httpclient 详解——第二章;
- HttpClient 对 cookie的处理
- flex 布局
- HDU 2546 饭卡(0-1背包)
- Docker误区、技巧、转换关系
- C#操作目录和文件
- 动态申请 相机权限
- git常用命令(四)
- 最小费用最大流模板
- Linux虚拟机的网络配置和系统配置
- 单调队列
- 练习题 No.21 邻接表