HDU_1114_背包问题
来源:互联网 发布:网络专供靠谱吗 编辑:程序博客网 时间:2024/05/17 01:19
题意就是:给你一定的空间,一定种类的硬币,每种硬币可以重复使用多次,让我们计算消耗这么多的空间的最小质量
dp[i+1][j]表示的就是从前i种硬币中挑选质量小于j的最小价值
转移方程:
dp[i+1][j] = min(dp[i][j],dp[i+1][j-w[i]]+v[i])//选取第i个
#include <iostream>#include <cstdio>#include <cstring>#define MAX_N 505#define MAX_W 10005#define INF 100000000using namespace std;//dp[i+1][j]表示从前i种硬币中挑选质量小于j的最小价值int dp[MAX_N][MAX_W];int n;int W;int v[MAX_N];int w[MAX_N];int t,k;int main(){ //freopen("完全背包A.txt", "r",stdin); scanf("%d",&t); k=t; while(t--) { int E,F; E=F=0; scanf("%d %d",&E,&F); W=F-E; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d %d",v+i,w+i); } void solve(); solve(); }}void solve(){ //dp[i+1][j]表示从前i种硬币中挑选质量小于j的最小价值 for(int i=0;i<n;i++) { for(int j=0;j<=W;j++) { dp[i][j]=INF; } } //dp[i+1][j]表示从前i种硬币中挑选质量小于j的最小价值 //初值设置***** 将dp[0][0]设为0; dp[0][0]=0; for(int i=0;i<n;i++) { for(int j=0;j<=W;j++) { if(j<w[i]) { dp[i+1][j]=dp[i][j]; } else{ dp[i+1][j]=min(dp[i][j],dp[i+1][j-w[i]]+v[i]); } } } if(dp[n][W]!=INF) { cout<<"The minimum amount of money in the piggy-bank is "<<dp[n][W]<<"."<<endl; } else{ cout<<"This is impossible."<<endl; }}
0 0
- HDU_1114_背包问题
- 【无限背包】背包问题
- 背包问题---01背包
- 背包问题--部分背包
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- CString转LPWSTR
- C#枚举值获取
- I/O复用——select系统调用
- jdk1.8 新特性
- yii框架中的session和cookie设置、使用以及清空
- HDU_1114_背包问题
- SQL语句太复杂,怎么优化
- Windows项目快捷方式链接地址
- kindle paperwhite2 越狱备忘
- C#程序如何以管理员身份自动运行
- Android事件分发机制完全解析,带你从源码的角度彻底理解
- IOS——第二个View中使用TabbarController例子,tabbar中页面间通过非tabbar按钮跳转(xib布局)
- Discuz xX 解除密码错误十五秒限制
- libev学习笔记(持续更新)