poj 1787(多重背包)
来源:互联网 发布:神经网络算法入门书籍 编辑:程序博客网 时间:2024/05/01 23:37
<pre name="code" class="cpp">/**************************************************采用系数化方法降低时间复杂度,首先将多重背包看成01背包且n[i]个背包可以将其带上系数分解可以降低分解的个数,最终降低时间复杂度。***************************************************/#include <iostream>#include<algorithm>#include<cmath>#include<cstring>#include<cstdio>using namespace std;struct pay{ int num; int cent[4]; pay() { cent[0] = 0; cent[1] = 0; cent[2] = 0; cent[3] = 0; num = 0; }};int mon(int i){ switch (i) { case 0: return 1; case 1: return 5; case 2: return 10; case 3: return 25; }}int main(){ int money[4],pri; while ( cin >> pri >>money[0] >> money[1] >> money[2] >> money[3] ) { if ( pri == 0 ) break; pay ways[10005]; int vis[10005] = {0}; vis[0] = 1; for ( int i = 0; i < 4; i++ ) { int l = 1; while ( money[i] - l > 0) { for ( int k = pri - l * mon(i); k >= 0; k-- ) { if ( vis[k] ) { if ( ways[k + l * mon(i)].num >= ways[k].num + l ); else { ways[k + l * mon(i)].num = ways[k].num + l; ways[k + l * mon(i)].cent[0] = ways[k].cent[0]; ways[k + l * mon(i)].cent[1] = ways[k].cent[1]; ways[k + l * mon(i)].cent[2] = ways[k].cent[2]; ways[k + l * mon(i)].cent[3] = ways[k].cent[3]; ways[k + l * mon(i)].cent[i] += l; } vis[ k + l*mon( i )] = 1; } } money[i] -= l; l *= 2;///采用二进制方法降低时间复杂度, ///在化为01背包的同时减少背包的个数,并且保证每个数字都可以取上 } l = money[i]; for ( int k = pri - l * mon(i); k >= 0; k-- ) { if ( vis[k] ) { if ( ways[k + l * mon(i)].num >= ways[k].num + l ); else { ways[k + l * mon(i)].num = ways[k].num + l; ways[k + l * mon(i)].cent[0] = ways[k].cent[0]; ways[k + l * mon(i)].cent[1] = ways[k].cent[1]; ways[k + l * mon(i)].cent[2] = ways[k].cent[2]; ways[k + l * mon(i)].cent[3] = ways[k].cent[3]; ways[k + l * mon(i)].cent[i] += l; } vis[ k + l*mon( i )] = 1; } } } if ( vis[pri] )///如果访问过的话就说明可以支付 printf("Throw in %d cents, %d nickels, %d dimes, and %d quarters.\n", ways[pri].cent[0],ways[pri].cent[1],ways[pri].cent[2],ways[pri].cent[3]); else printf("Charlie cannot buy coffee.\n"); }}
0 0
- poj 1787(多重背包)
- POJ 1276(多重背包)
- poj 1276(多重背包)
- POJ-1276(多重背包)
- POJ-1742(多重背包)
- POJ 2392(多重背包)
- POJ 1276(多重背包)
- 动态规划,多重背包,保存路径,用完全背包的方法做多重背包(Charlie's Change,poj 1787)
- POJ 1787 Charlie's Change(多重背包+记录路径)
- poj 1787 多重背包(硬币付款不找钱)
- poj 1787 多重背包+路径记录
- poj 1787 多重背包 记录路径
- poj 1787 多重背包记录路径
- poj 1787 记录路径的多重背包
- POJ 1787 Change 多重|完全背包
- POJ 1014 Dividing (多重背包)
- POJ 1276 Cash Machine (多重背包)
- POJ 2392 Space Elevator (多重背包)
- HDUJ 1019 Least Common Multiple
- 最长回文字串--------注意一个小点-----添加字符的问题
- java面试题及答案(基础题122道,代码题19道)
- STL 源码剖析 算法 stl_algo.h -- next_permutation
- 太容易让他一人太诱人
- poj 1787(多重背包)
- 【BZOJ】【P1455】【罗马游戏】【题解】【斜堆】
- 有了无线网卡驱动,但总是安装不成功的解决办法
- 路由器端口映射
- Vs2013编译Boost asio时出现的错误
- poj 2244 Eeny Meeny Moo 约瑟夫环
- sizeof memset strlen 几个常见小错误 小结
- POJ 1573 Robot Motion 搜索
- 无向图的割顶和桥、无向图的双连通分量、有向图的强连通分量