博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU - 1074 DP(完全背包)
阅读量:5901 次
发布时间:2019-06-19

本文共 1257 字,大约阅读时间需要 4 分钟。

题目大意:

T组数据,每组数据一个n,代表n种类型的硬币,首先给你E,F,然后F-E代表背包可容纳总重量,下面给出n种硬币的价值wiwi和重量vivi,每种不限数量,问装满可容纳F-E重量的背包硬币价值最小是多少。如果不能,则输出This is impossible.

数据范围:

1n500,1EF10000,1wi50000,1vi10000.1≤n≤500,1≤E≤F≤10000,1≤wi≤50000,1≤vi≤10000.

解题思路:

题意可简化为,n种物品,每种无数个,装满W重量的背包的最小价值,这是一个完全背包的题,dp[j]代表承重为j的背包的最小价值,转移方程为:

dp[j]=max(dp[j],dp[jv[i]]+w[i])dp[j]=max(dp[j],dp[j−v[i]]+w[i])
具体见代码

AC代码:

#include
#include
#include
#include
#include
#include
using namespace std;const int maxn = 10000;const int INF = 1e9 + 7;int dp[maxn + 5];int E, F, W;int T, n;int w[505], v[505];int main() { scanf("%d", &T); while(T--) { for(int i = 0; i <= maxn; i++)dp[i] = INF;//初始化为无穷大 scanf("%d%d", &E, &F); W = F - E;//背包大小 scanf("%d", &n); for(int i = 1; i <= n; i++)scanf("%d%d", &w[i], &v[i]); dp[0] = 0; for(int i = 1; i <= n; i++) { //虽然每个物体有无限个,但是对于第i个物体,dp[j]可由dp[j-v[i]]转移过来,就达到了取任意多个第i种物体之后的状态 for(int j = v[i]; j <= W; j++) { dp[j] = min(dp[j], dp[j - v[i]] + w[i]); } } if(dp[W] == INF)printf("This is impossible.\n");//如果值未改变,说明不存在该状态 else printf("The minimum amount of money in the piggy-bank is %d.\n", dp[W]); } return 0;}

转载于:https://www.cnblogs.com/TRDD/p/9813532.html

你可能感兴趣的文章
nginx 根据url访问次数限制
查看>>
设计模式-工厂模式三部曲
查看>>
ArcGIS Engine中的数据访问
查看>>
POJ 1862 Stripies【哈夫曼/贪心/优先队列】
查看>>
图着色问题
查看>>
伟大的神器 pjax 在thinkphp中的应用
查看>>
android 底部tabview模板
查看>>
Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,java 判断请求是不是ajax请求
查看>>
vsftp 服务配置
查看>>
前端路由
查看>>
移动管理后台
查看>>
oracle的导入导出
查看>>
plink: 等位型计数(allele count)
查看>>
C# 登陆淘宝 (非webbrowser)
查看>>
算法分析与设计——贪心法实验报告
查看>>
js时间戳与日期格式的相互转换
查看>>
POJ - 1062 昂贵的聘礼(Dijkstra)
查看>>
Java多态和动态绑定是如何实现的
查看>>
sql server 下载安装标记
查看>>
Android学习6—单元测试的使用
查看>>