POJ 3260 DP
来源:互联网 发布:api原油库存今天数据 编辑:程序博客网 时间:2024/06/01 19:25
只需要对John的付款数做一次多重背包,对shopkeeper的找零钱数做一次完全背包即可。
最重要的是上界的处理。可以注意到,John的付款数最多为maxv*maxv+m,也就是24400元。同理,shopkeeper找钱最多的数目为maxv*maxv.
证明如下:
如果John的付款数大于了maxv*maxv+m,即付硬币的数目大于了maxv,根据鸽笼原理,至少有两个的和对maxv取模的值相等,也就是说,这部分硬币能够用更少的maxv来代替。证毕。
转自:http://www.cnblogs.com/Thispoet/archive/2011/09/20/2182022.html
另:Discuss里的数据不要信。。。。。
// by SiriusRen#include <cstdio>#include <cstring>#include <algorithm>using namespace std;int n,t,v[105],c[105],num[25000],f[25000],g[25000],ans=0x3ffffff;int main(){ scanf("%d%d",&n,&t); for(int i=1;i<=n;i++)scanf("%d",&v[i]); for(int i=1;i<=n;i++)scanf("%d",&c[i]); memset(f,0x3f,sizeof(f)),f[0]=0; memset(g,0x3f,sizeof(g)),g[0]=0; for(int i=1;i<=n;i++){ memset(num,0,sizeof(num)); for(int j=0;j<=24500;j++) if(f[j+v[i]]>f[j]+1&&num[j]<c[i])f[j+v[i]]=f[j]+1,num[j+v[i]]=num[j]+1; } for(int j=1;j<=n;j++) for(int i=0;i<=24500;i++) g[i+v[j]]=min(g[i+v[j]],g[i]+1); for(int i=t;i<=24000;i++)ans=min(ans,f[i]+g[i-t]); if(ans!=0x3ffffff)printf("%d",ans); else puts("-1");}
0 0
- poj 3260 DP
- POJ 3260(DP)
- POJ 3260 DP
- poj dp
- 【dp】POJ
- 【dp】POJ
- [DP] POJ
- [DP] POJ
- [DP] POJ
- 【dp】POJ
- POJ 3260The Fewest Coins (DP)
- 【DP】 POJ 3260 The Fewest Coins 背包
- POJ 3670 && POJ 3671 (dp)
- 【DP】 POJ 1080
- poj 1163经典DP
- poj 1088 滑雪(DP)
- poj 1770 树形dp
- POJ 1179 Polygon(DP)
- Asp.net使用Table标签填充数据库数据
- LeetCode--373. Find Pairs with Smallest Sums
- HDU 3065病毒侵袭持续中 ac自动机
- HDU Life 5754 Winner Bo 各类博弈
- 第五天作业
- POJ 3260 DP
- poj 3714 japan (分治)
- 51单片机之外设——点亮LED
- 基于有序的查找算法总结
- jquery 全国三级联动
- Scrum敏捷研发体系初探
- web框架学习前复习——Servlet
- 转: ionic cordova 控制iOS状态栏的显示,隐藏,颜色
- git超详细教程