POJ 1384 Piggy-Bank
来源:互联网 发布:html5 答题游戏源码 编辑:程序博客网 时间:2024/05/18 00:52
题目链接 POJ 1384
题意:有N种钱币,每一种有面值P和重量W两种属性。现给出存钱罐净重和现重,要求往存钱罐里放钱,能使存钱罐达到这种状态的最小总面值。
输入数据:
第一行一个T,代表测试数据组数。
第二行两个数分别代表存钱罐净重和现重。
第三行一个N,表示钱币种类。
以下N行,每行两个数P,W分别代表一种钱币的面值和重量。
解析: 变形的完全背包问题,只要将dp[]的值初始化为最大,然后用状态转移方程
dp[v] = MIN(dp[v],dp[v -W[i]] + P[i]); (v = 0...V , i = 0...N)(V表示钱币总重);
进行求解即可
代码如下:
#include <stdio.h>#include <string.h>#define MIN(a,b) ((a) > (b) ? (b) : (a))#define MAXN 550#define MAXM 10010int P[MAXN];int W[MAXN];int dp[MAXM];int n,m;void Init(){int i;memset(P,0,sizeof(P));memset(W,0,sizeof(W));scanf("%d %d",&n,&m);m -= n;scanf("%d",&n);for(i = 0;i < n;i ++){scanf("%d %d",P + i,W + i);}for(i = 0;i < MAXM ;i ++){dp[i] = 100000000;}}void DP(){int i,j;dp[0] = 0;for(i = 0;i < n;i ++){for(j = 0;j <= m;j ++){if(j - W[i] >= 0){dp[j] = MIN(dp[j],dp[j - W[i]] + P[i]);}}}}int main(){int T;while(scanf("%d",&T) != EOF){while(T --){Init();DP();if(dp[m] != 100000000){printf("The minimum amount of money in the piggy-bank is %d.\n",dp[m]);}else {printf("This is impossible.\n");}}}return 0;}
- poj 1384 Piggy-Bank
- poj 1384 Piggy-Bank
- POJ 1384 Piggy-Bank
- poj 1384 piggy-bank
- POJ 1384 Piggy-Bank
- POJ 1384 Piggy-Bank
- poj 1384 Piggy-Bank
- POJ 1384 Piggy-Bank
- poj 1384 Piggy-Bank
- POJ 1384 Piggy-Bank
- POJ 1384 Piggy-Bank
- POJ 1384 Piggy-Bank
- POJ 1384 Piggy-Bank DP
- POJ 1384 Piggy-Bank 笔记
- POJ 1384 Piggy-Bank (ZOJ 2014 Piggy-Bank) 完全背包
- poj 1384 Piggy-Bank 完全背包
- poj 1384Piggy-Bank(完全背包)
- POJ 1384 Piggy-Bank (完全背包)
- 修改 Pivot 控件的 PivotItem 标题字体大小
- JAVA基础之线程
- adding two images
- IP地址查询接口及调用方法
- CocosBuilder 超详细教程
- POJ 1384 Piggy-Bank
- qt C++ 变长实参的函数
- R语言与区间估计学习笔记
- Android -使用DOM(文档对象模型)解析XML文件
- 单例设计模式
- vc控制台项目wprinf无法正确输出中文的解决办法
- FilterDispatcher的作用
- SSL协议
- 修改SampleCode 例子代码 单值专题图