Piggy-Bank HDU
来源:互联网 发布:好老板进销存软件 编辑:程序博客网 时间:2024/06/05 07:48
完全背包
题目描述:有一个小猪存钱罐,求在正好的重量的情况下的,存钱的最小值,如果不能满重输出This is impossible.
解题分析:不限次数,完全背包,因为是求最小值,所以初始化时是满重,但是dp[0]必须得是0,不然dp[j] = min (dp[j], dp[j-w[i]] + v[i])这个式子没法更新。思考一个问题,为什么当最终dp[w] = INF的时候,就是不能正好的情况呢?注意观察上面的状态转移方程,只有当dp[j-w[i]] != INF的时候,这个式子才会更新,也就是说当dp[j-w[i]] != INF时,
dp[j-w[i]] 一定可以由确切数目的硬币组成,前面递推同理。所以最终如果dp[w]更新过,则一定可以有确切的硬币数组成重量正好是w的情况。
代码如下:
#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>using namespace std;const int INF = 0x3f3f3f3f;const int maxn = 10000 + 10;int w[maxn];int v[maxn];int dp[maxn];int W,N;int main(){ int kase; cin >> kase; while(kase--) { int E,F; scanf("%d %d",&E,&F); W = F - E; cin >> N; for(int i = 1; i <= N; i++) { scanf("%d %d",&v[i],&w[i]); } memset(dp,0x3f,sizeof(dp)); dp[0] = 0; for(int i = 1; i <= N; i++) { for(int j = w[i]; j <= W; j++) { dp[j] = min (dp[j], dp[j-w[i]] + v[i]); } } if(dp[W] != INF ) printf("The minimum amount of money in the piggy-bank is %d.\n",dp[W]); else printf("This is impossible.\n"); } return 0;}
阅读全文
1 0
- hdu 1114 Piggy-Bank
- HDU 1114 Piggy-Bank
- HDU 1114 Piggy-Bank
- hdu 1114 Piggy-Bank
- HDU 1114 Piggy-Bank
- hdu 1114 Piggy-Bank
- hdu piggy-bank 1114
- Hdu 1114 Piggy-Bank
- hdu 1114 Piggy-Bank
- hdu 1114 Piggy-Bank
- hdu 1114 Piggy-Bank
- hdu 1114 Piggy-Bank
- hdu 1114 Piggy-Bank
- hdu 1114 Piggy-Bank
- HDU 1114 Piggy-Bank
- HDU 1114 Piggy-Bank
- HDU 1114 Piggy-Bank
- HDU-1114-Piggy-Bank
- Spring-MVC入门-spring表单提交中文乱码解决
- Java获取当前时间,前一天时间
- 数据库和SQL基本知识点
- mac os libray not loaded:(加载dylib出错)
- 数据结构顺序表
- Piggy-Bank HDU
- CString 的坑
- 继承和对象组合
- Android Telephony分析(二)--- RegistrantList详解
- python入门:环境配置和IDE安装
- JavaScript表单验证二
- C++学习笔记之顺序容器
- VS2010下安装boost库
- TensorFlow