【题目链接】 http://poj.org/problem?id=3260

【题目大意】

  给出你拥有的货币种类和每种的数量,商店拥有的货币数量是无限的,
  问你买一个价值为m的物品,最少的货币流通数量为多少

【题解】

  我们可以计算出买不同价值的物品,在没有找钱情况下的最少用币数量,
  记为dp[i],这个可以用多重背包来完成,对于商店来说,我们可以计算出,
  对于不同额度的找零,最少用币数量,记为f[i],
  我们发现,对于货币流通最少,就是求dp[i+m]+f[i]的最小值,
  由鸽巢原理可得我们只要计算maxw*maxw+m的dp值就可以了。

【代码】

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
int m,n,w[110],c[110],dp[24563],f[24563];
int main(){
while(~scanf("%d%d",&n,&m)){
int maxn=0;
for(int i=1;i<=n;i++)scanf("%d",&w[i]),maxn=max(maxn,w[i]);
for(int i=1;i<=n;i++)scanf("%d",&c[i]);
maxn=maxn*maxn+m+1;
memset(dp,INF,sizeof(dp));
dp[0]=0;
for(int i=1;i<=n;i++){
if(c[i]*w[i]>=maxn){
for(int j=w[i];j<=maxn;j++)dp[j]=min(dp[j],dp[j-w[i]]+1);
}else{
for(int k=1;k<c[i];k<<=1){
for(int j=maxn;j>=w[i]*k;j--)dp[j]=min(dp[j],dp[j-w[i]*k]+k);
c[i]-=k;
}for(int j=maxn;j>=w[i]*c[i];j--)dp[j]=min(dp[j],dp[j-w[i]*c[i]]+c[i]);
}memset(f,INF,sizeof(f));f[0]=0;
}
for(int i=1;i<=n;i++){
for(int j=w[i];j<=maxn;j++)f[j]=min(f[j],f[j-w[i]]+1);
}int ans=INF;
for(int i=0;i<=maxn-m;i++)ans=min(ans,dp[i+m]+f[i]);
if(ans==INF)ans=-1;
printf("%d\n",ans);
}return 0;
}

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(多重背包问题, 找零问题, 二次DP)

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

  4. poj 3260 The Fewest Coins

    // 转载自http://blog.163.com/benz_/blog/static/18684203020115721917109/算法不难看出,就是一个无限背包+多重背包.问题在于背包的范围.设 ...

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

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

  6. The Fewest Coins POJ - 3260

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

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

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

  8. POJ3260The Fewest Coins[背包]

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

  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. 一串跟随鼠标的DIV

    div跟随鼠标移动的函数: <!DOCTYPE HTML><html><head> <meta charset="utf-8"> & ...

  2. Django项目知识点汇总

    目录 一.wsgi接口 二.中间件 三.URL路由系统 四.Template模板 五.Views视图 六.Model&ORM 七.Admin相关 八.Http协议 九.COOKIE 与 SES ...

  3. JAVA【一】

    1,abstract可以修饰什么?为什么不能修饰属性 --abstract是抽象的意思,在java中,规定只能修饰类或者方法,所以不能修饰属性. (1)abstract修饰类,会使这个类成为一个抽象类 ...

  4. bzoj 2748 DP

    比较裸的背包,w[i][j]代表到第I个操作的时候音量j能不能达到,然后转移就行了. /******************************************************** ...

  5. Runtime类 调用windows程序。

    import java.io.*; public class webcyz { /** * @param args */ public static void main(String[] args) ...

  6. python3 面向对象补充

    f = People('egon',18,'male') 非函数hasattr # hasattr(f,'name')getattr # getattr(f,'name')setattr # seta ...

  7. [Leetcode Week6]Best Time to Buy and Sell Stock

    Best Time to Buy and Sell Stock 题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/best-time-to-buy-and ...

  8. tmux下make menuconfig背景色不正常问题

    参考https://blog.tankywoo.com/2015/10/24/tmux-mutt-not-redraw-problem.html 是由于~/.bashrc或~/.zshrc设置,覆盖了 ...

  9. MFC/Socket网络编程

    转载: https://jingyan.baidu.com/article/676629974557c254d51b84da.html

  10. Tarjan & LCA 套题题目题解

    刷题之前来几套LCA的末班 对于题目 HDU 2586 How far away 2份在线模板第一份倍增,倍增还是比较好理解的 #include <map> #include <se ...