// 转载自
http://blog.163.com/benz_/blog/static/18684203020115721917109/
算法不难看出,就是一个无限背包+多重背包。
问题在于背包的范围。
设John出了X元,则需要找零X-T元。
证明X不超过T+v_max^2:
假设超过了,则找零超过v_max^2,则找零的货币数定超过v_max,
根据抽屉原理,必然有若干个货币组合起来是v_max的倍数,
那么这些货币肯定可以在给钱的时候少给一些,从而推出这样的方案肯定不是最优方案。
复杂度:O(n*(T+vmax^2))  // 我自己做时 是把所有 v[i]相加 得到的 复杂度为 O(n*(T+sum{v[i]})) 然后 WA告诉我我的想法是错误的
// 然后试了下 直接让sum =12000 居然A掉了 然后百度了下 找到了上面的证明 #include <iostream>
#include <algorithm>
#include <queue>
#include <math.h>
#include <stdio.h>
#include <string.h>
using namespace std;
#define MOD 1000000007
#define maxn 24410
int dp[maxn];
int dp2[];
int V[];
int sum;
int num[];
int main()
{
int N,T;
while(scanf("%d %d",&N,&T)!=EOF){
int i,j,k;
sum=;
for(i=;i<=N;i++)
scanf("%d",&V[i]),sum=max(sum,V[i]);//,sum+=V[i];
for(i=;i<=N;i++)
scanf("%d",&num[i]);
sum=sum*sum;
for(i=;i<=T+sum;i++)
dp[i]=MOD;
for(i=;i<=sum;i++)
dp2[i]=MOD; for(i=;i<=N;i++){
k=;
int tp;
while(num[i]>=k){
tp=k*V[i];
for(j=sum+T;j>=tp;j--)
dp[j]=min(dp[j],dp[j-tp]+k);
num[i]-=k;
k=k<<;
}
if(num[i]){
k=num[i];
tp=k*V[i];
for(j=sum+T;j>=tp;j--)
dp[j]=min(dp[j],dp[j-tp]+k);
} for(j=V[i];j<=sum;j++)
dp2[j]=min(dp2[j],dp2[j-V[i]]+);
}
int ans=MOD;
for(i=T;i<=sum+T;i++)
ans=min(ans,dp[i]+dp2[i-T]);
if(ans==MOD) printf("-1\n");
else printf("%d\n",ans);
}
return ;
}

poj 3260 The Fewest Coins的更多相关文章

  1. POJ 3260 The Fewest Coins(多重背包+全然背包)

    POJ 3260 The Fewest Coins(多重背包+全然背包) http://poj.org/problem?id=3260 题意: John要去买价值为m的商品. 如今的货币系统有n种货币 ...

  2. POJ 3260 The Fewest Coins(完全背包+多重背包=混合背包)

    题目代号:POJ 3260 题目链接:http://poj.org/problem?id=3260 The Fewest Coins Time Limit: 2000MS Memory Limit: ...

  3. POJ 3260 The Fewest Coins(背包问题)

    [题目链接] http://poj.org/problem?id=3260 [题目大意] 给出你拥有的货币种类和每种的数量,商店拥有的货币数量是无限的, 问你买一个价值为m的物品,最少的货币流通数量为 ...

  4. POJ 3260 The Fewest Coins(多重背包问题, 找零问题, 二次DP)

    Q: 既是多重背包, 还是找零问题, 怎么处理? A: 题意理解有误, 店主支付的硬币没有限制, 不占额度, 所以此题不比 1252 难多少 Description Farmer John has g ...

  5. POJ 3260 The Fewest Coins 最少硬币个数(完全背包+多重背包,混合型)

    题意:FJ身上有各种硬币,但是要买m元的东西,想用最少的硬币个数去买,且找回的硬币数量也是最少(老板会按照最少的量自动找钱),即掏出的硬币和收到的硬币个数最少. 思路:老板会自动找钱,且按最少的找,硬 ...

  6. The Fewest Coins POJ - 3260

    The Fewest Coins POJ - 3260 完全背包+多重背包.基本思路是先通过背包分开求出"付出"指定数量钱和"找"指定数量钱时用的硬币数量最小值 ...

  7. POJ3260The Fewest Coins[背包]

    The Fewest Coins Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6299   Accepted: 1922 ...

  8. POJ3260——The Fewest Coins(多重背包+完全背包)

    The Fewest Coins DescriptionFarmer John has gone to town to buy some farm supplies. Being a very eff ...

  9. (混合背包 多重背包+完全背包)The Fewest Coins (poj 3260)

    http://poj.org/problem?id=3260   Description Farmer John has gone to town to buy some farm supplies. ...

随机推荐

  1. 【娱乐】高端小游戏Manufactoria

    Manufactoria 是一款游戏.游戏中,一家生产机器人的工厂内部出了一 些问题,生产出来的机器人有很多不合格的.一个机器人可以用一个含有红色和 蓝色的颜色串来描述,只有颜色串符合某种规律的机器人 ...

  2. uva 11489

    简单博弈 #include <cstdio> #include <cstdlib> #include <cmath> #include <map> #i ...

  3. HTML5 动画引擎 小记

    国内: Cocos2d-x js版本   layabox Egret Sirius2D lufylegend.js Fireball 国外: CreateJS(EaselJS.TweenJS)http ...

  4. 【Unity3D】iOS 推送实现

    原地址:http://www.iappfan.com/%E3%80%90unity3d%E3%80%91ios-%E6%8E%A8%E9%80%81%E5%AE%9E%E7%8E%B0/ #impor ...

  5. Web Server 和 HTTP协议(转)

    转自:http://www.kuqin.com/shuoit/20150809/347488.html 一直在找实习,有点什么东西直接就在evernote里面记了,也没时间来更新到这里.找实习真是个蛋 ...

  6. Open multiple Eclipse workspaces on the Mac

    This seems to be the supported native method in OS X: cd /Applications/eclipse/ open -n Eclipse.app ...

  7. StringBuffer 和 StringBuilder

    如果你读过<Think in Java>,而且对里面描述HashTable和HashMap区别的那部分章节比较熟悉的话,你一定也明白了原因所在.对,就是支持线程同步保证线程安全而导致性能下 ...

  8. 用cxSelect插件补充一下回显过滤项功能

    这个在DJANGO里,最好在过滤之后,让用户知道自己过滤的选择.所以要定位默认值. 1,在HTML文件里显示默认值: <form class="uk-form" name=& ...

  9. cojs 疯狂的求和问题 解题报告

    QAQ 好久不在cojs上出题了 最近学了点新科技,于是就做成题来分享了 这道题是要求simga(i^k) 那么就先说说部分分的算法吧: 10分: 直接暴力就可以了,时间复杂度O(nlogk) 30分 ...

  10. lintcode :搜索二维矩阵

    题目: 搜索二维矩阵 写出一个高效的算法来搜索 m × n矩阵中的值. 这个矩阵具有以下特性: 每行中的整数从左到右是排序的. 每行的第一个数大于上一行的最后一个整数. 样例 考虑下列矩阵: [ [1 ...