E - Coin Change UVA - 674 &&(一些记录路径的方法)
这一道题并不难,我们只需要将dp数组先清空,再给dp【0】=1,之后就按照完全背包的模板写
主要是我们要证明着一种方法不会出现把(1+3+4)(1+4+3)当作两种方法,这一点如果自己写过背包的那个表的话肯定知道是不会出先这种情况的
证明如下:(就拿这一道题的第一个例子来举例)
0 1 2 3 4 5 6 7 8 9 10 11 12
d=1 1 1 1 1 1 1 1 1 1 1 1 1 1
d=5 1 1 1 1 1 2 2 2 2 2 3 3 3
d=10 1 1 1 1 1 2 2 2 2 2 4 4 4
由此可见是不会出现把(5 5 1)(1 5 5)当两种情况,,因为按顺序来是先让1来填冲数组,所以每一个数中如果有一,那肯定是最先加进去的,不可能在之后又加进去,而且相同的数要是出现多次肯定是在一起出现的,不会出现(5 1 5)这种情况。。。。好了,到这里我算结束了。。。。
代码如下:
#include<stdio.h>
#include<string.h>
int q[],v[];
int main()
{
int a,s,d,f,g;
q[]=;
q[]=;
q[]=;
q[]=;
q[]=;
while(~scanf("%d",&a))
{
memset(v,,sizeof(v));
v[]=;
for(s=; s<=; ++s)
{
for(d=; d+q[s]<=a; ++d)
{
v[d+q[s]]=v[d]+v[d+q[s]];
}
}
printf("%d\n",v[a]);
}
return ;
}
下面是01背包等的一些模板加上记录路径 转自:https://blog.csdn.net/m0_37830950/article/details/70243226
01模板:
#include <iostream>
#include<algorithm> using namespace std; int main()
{
int total_weight = ;
int w[] = { ,,,,, };
int v[] = { ,,,,, };
int dp[] = { };
int path[][] = { }; for (int i = ; i <= ; i++)
for (int j = ; j >= w[i]; j--)
if (dp[j] < dp[j - w[i]] + v[i])
{
dp[j] = dp[j - w[i]] + v[i];
path[i][j] = ;
} int i = , j = ;
while (i > && j > )
{
if (path[i][j] == )
{
cout << i << ' ';
j -= w[i];
}
i--;
}
cout << endl; cout << "总的价值为: " << dp[] << endl;
return ;
}
另外一种二维数组的:
#include<bits/stdc++.h>
#define MAXN 0x7ff
using namespace std;
int m,n,w[MAXN],c[MAXN];
int f[MAXN][MAXN],i,j;//f[i][v]表示第i件物品放入容量为v的背包所能产生的最大价值。
int maxn(int x,int y)//比较,输出最大值
{
if(x>y)
return x;
else
return y;
}
int main()
{
cin>>m>>n;
for(i=;i<=n;i++)
cin>>w[i]>>c[i];//输入不解释
for(i=;i<=n;i++)
for(j=m;j>;j--)
{
if(w[i]<=j)
f[i][j]=maxn(f[i-][j],f[i-][j-w[i]]+c[i]);//状态转移方程式。
else f[i][j]=f[i-][j];
}
cout<<f[n][m];
return ;
}
完全背包
#include <iostream>
#include<algorithm> using namespace std; int main()
{
int total_weight = ;
int w[] = { ,,,,, };
int v[] = { ,,,,, };
int dp[] = { };
int path[][] = { }; for (int i = ; i <= ; i++)
for (int j = w[i]; j <= ; j++)
if (dp[j] < dp[j - w[i]] + v[i])
{
dp[j] = dp[j - w[i]] + v[i];
path[i][j]=;
} int i = , j = ;
while (i > && j > )
{
if (path[i][j] == )
{
cout << i << ' ';
j -= w[i];
}
else
i--;
}
cout << endl; cout << "总的价值为: " << dp[] << endl;
return ;
}
多重背包
#include <iostream>
#include<algorithm> using namespace std; int main()
{
int total_weight = ;
int w[] = { ,,,,, };
int v[] = { ,,,,, };
int cot[] = { ,,,,, };
int dp[] = { };
int path[][] = { }; for (int i = ; i <= ; i++)
for (int k = ; k <= cot[i]; k++)
for (int j = ; j >= w[i]; j--)
if (dp[j] < dp[j - w[i]] + v[i])
{
dp[j] = dp[j - w[i]] + v[i];
path[i][j] = ;
} int i = , j = ;
while (i > && j > )
{
if (path[i][j] == &&cot[i])
{
cout << i << ' ';
j -= w[i];
cot[i]--;
}
else
i--;
}
cout << endl; cout << "总的价值为: " << dp[] << endl;
return ;
}
E - Coin Change UVA - 674 &&(一些记录路径的方法)的更多相关文章
- Charlie's Change(完全背包记录路径)
Charlie is a driver of Advanced Cargo Movement, Ltd. Charlie drives a lot and so he often buys coffe ...
- Coin Change UVA
Suppose there are 5 types of coins: 50-cent, 25-cent, 10-cent, 5-cent, and 1-cent. We want to makech ...
- 【DP】UVA 624 CD 记录路径
开一个数组p 若dp[i-1][j]<dp[i-1][j-a[i]]+a[i]时就记录下p[j]=a[i];表示此时放进一个轨道 递归输出p #include <stdio.h> # ...
- POJ 1015 Jury Compromise (记录路径的背包问题)
(点击此处查看原题) 题意 为了审判某一个人,需要在n个人当中选出m个人组成陪审团,n个人中每个人都有作为起诉方的价值p和作为辩护方的价值d,为了保证公平性,要求m个人作为起诉方的价值之和P和作为辩护 ...
- HDOJ-1043 Eight(八数码问题+双向bfs+高效记录路径+康拓展开)
bfs搜索加记录路径 HDOJ-1043 主要思路就是使用双向广度优先搜索,找最短路径.然后记录路径,找到结果是打印出来. 使用康拓序列来来实现状态的映射. 打印路径推荐使用vector最后需要使用a ...
- UVA 674 Coin Change(dp)
UVA 674 Coin Change 解题报告 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87730#problem/ ...
- UVA.674 Coin Change (DP 完全背包)
UVA.674 Coin Change (DP) 题意分析 有5种硬币, 面值分别为1.5.10.25.50,现在给出金额,问可以用多少种方式组成该面值. 每种硬币的数量是无限的.典型完全背包. 状态 ...
- UVA 624(01背包记录路径)
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- 训练指南 UVA - 11374(最短路Dijkstra + 记录路径 + 模板)
layout: post title: 训练指南 UVA - 11374(最短路Dijkstra + 记录路径 + 模板) author: "luowentaoaa" catalo ...
随机推荐
- sql 语句中as的用法和作用
我们的Sql语句在很多数据库中都是通用的,比如像Mysql数据库 Access数据库. Oracle数据库. Sqlite数据库 .甚至在我们的Excel中也可以使用Sql语句. 在我的数据库中有u ...
- varnish与squid缓存效率对比实例
前提:安装varnish.squid.webbench(压测工具) 注:varnish和squid机都未安装其他多余服务,服务器绑定域名为www.dannylinux.top (为同一台服务器,测试 ...
- Windows 10 & React Native & Android
Windows 10 & React Native & Android https://facebook.github.io/react-native/docs/getting-sta ...
- Oracle查看表实际占用空间和实际行数
select t.table_name,t.num_rows from user_tables t ORDER BY NUM_ROWS DESC;//实际行数 analyze table emp co ...
- sql中检查时间是否重叠
先画一个时间轴,方便理解. 设新的时间块,开始时间为@BeginDate,结束时间为@EndDate.数据库中的数据为BeginDate和EndDate 这样可以直观的看出来,新的时间块插入进来,只需 ...
- xgboost 非官方每天编译
xgboost http://ssl.picnet.com.au/xgboost/ 非官方每天编译
- Nginx CONTENT阶段 concat模块
L67 concat_delimiter : 根据js 指定 分隔符 比如 “|” 那么每个文件分隔符为 “|” concat_types : 指定要合并文件的类型 concat_unique : s ...
- BZOJ5507 GXOI/GZOI2019旧词 (树链剖分+线段树)
https://www.cnblogs.com/Gloid/p/9412357.html差分一下是一样的问题.感觉几年没写过树剖了. #include<iostream> #include ...
- nsx-edge虚拟机抓包实践
Edge抓包 今天在客户端进行故障排除时,我需要在环境中的一个边缘服务网关上执行包捕获.在诊断一系列不同的问题时,执行包捕获通常非常有用. 要启动包捕获,您可以跳到ESG的控制台,或者像我在本例中所做 ...
- Linux 三剑客(Awk、Sed、Grep)
grep/egrep 主要作用:给搜索过滤出来的内容加上颜色和排除功能 常用参数 -V 打印grep的版本号 -E 解释PATTERN作为扩展正则表达式,也就相当于使用egrep. 或操作 -F 解释 ...