POJ-1276-Cash Machine-多重背包
2015-12-01 19:32
288 查看
http://poj.org/problem?id=1276
给sum,
给n种货币,第i种面值为val[i],w[i]为重量
求可以凑成最接近sum的值。。
就是个01背包加上二进制优化。转成多重背包。。
给sum,
给n种货币,第i种面值为val[i],w[i]为重量
求可以凑成最接近sum的值。。
就是个01背包加上二进制优化。转成多重背包。。
#include <cstdio> #include <cmath> #include <cstring> #include <string> #include <algorithm> #include <iostream> #include <queue> #include <map> #include <set> #include <vector> using namespace std; double eps=0.0000001; int max(int a,int b){return a>b?a:b;} struct node { int num,val; }; node tm[15]; node nnn[105]; const double inf=2147483647; int cmp(node a,node b) { return a.val<b.val; } int dp[100005]; int main() { int i,j; int n,m; while(scanf("%d",&n)!=EOF) { memset(dp,0,sizeof(dp)); scanf("%d",&m); for (i=1;i<=m;i++) { scanf("%d %d",&tm[i].num,&tm[i].val); } int cun=0; for (i=1;i<=m;i++) //二进制拆分 { int k=1; int tt=tm[i].num; int v=tm[i].val; while(k<=tt) { nnn[++cun].val=v; nnn[cun].num=k; tt=tt-k; k=k*2; } if (!tt) continue; //价值为0的物品集无意义 nnn[++cun].val=v; nnn[cun].num=tt;//余数 } dp[0]=1; for (i=1;i<=cun;i++) { int vv=nnn[i].val*nnn[i].num; for (j=n;j>=vv;j--) { dp[j]=max(dp[j],dp[j-vv]); } } for (j=n;j>=0;j--) { if (dp[j]) { printf("%d\n",j); break; } } } return 0; }
相关文章推荐
- 410c与MS10物联网系统的点灯代码分析
- 通过VS设置使程序具有管理员权限
- 抽象类第一课(的注释)
- object-c之UITableView数据的编辑
- object-c之UITableView数据的编辑
- OpenCV读取序列图片(一)
- poj 1062 昂贵的聘礼 最短路bellman
- windows下C++学习推荐书籍
- Linux Weblogic 数据源 TimesTen配置
- JavaEE_Mybatis_SpringMVC_SpringMVC_lesson1_简单的SpringMVC框架搭建指南
- 【Android Studio】制作启动画面Splash Screen
- android欢迎界面并执行任务
- re.split() Python
- MATLAB常用数学函数
- 移动端图片轮播—swipe滑动插件
- linux sed命令详解
- iLBC
- Java的接口、继承
- 单调队列 I
- iOS开发之自定义view—Quartz2D