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 ...
随机推荐
- PowerDesigner 批量添加字段
Option Explicit Dim mdl ' the current model Set mdl = ActiveModel Dim Tab 'running table Dim col_1 D ...
- Python——模块——linecache(对文本行的随机访问)
一.模块的作用 linecache模块允许它获取Python资源文件的任一行. 二.模块函数 (1)linecache. getline(filename, lineno, module_global ...
- Linux下find命令用法详解
Linux下find命令用法详解 学神VIP烟火 学神IT教育:XueGod-IT 最负责任的线上直播教育平台 本文作者为VIP学员 烟火 第一部分:根据文件名查找 1.在当前目录 ...
- <el-upload></el-upload>组件上传图片到七牛云
[01]搭建好页面结构.定义数据与接口 <el-upload method="post" ref="upload" :action="domai ...
- P1177 【模板】快速排序(学完归并和堆排之后的二更)
P1177 [模板]快速排序 不用说,连题目上都标了是一道模板,那今天就来对能用到的许多排序方式进行一个总结: 选择排序 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理 ...
- 小白月赛13 小A的柱状图 (单调栈)
链接:https://ac.nowcoder.com/acm/contest/549/H来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言52428 ...
- 一文入门HTML5
1.HTML5 上节回顾:一文读懂ES6(附PY3对比) | 一文入门NodeJS 演示demo:https://github.com/lotapp/BaseCode/tree/master/java ...
- 洛谷P3327 约数个数和 结论+莫比乌斯反演
原题 就是让你求\(\sum\limits_{i=1}\sum\limits_{j=1}d(ij)\)(其中\(d(x)\)表示\(x\)的因数个数) 首先有引理(然而并没有证明): \(d(ij)= ...
- python+appium模拟手机物理按键操作
一句代码:driver.keyevent() 括号里填入的是手机物理按键的数字代号 driver.press_keycode() 括号里填入的是键盘按键的数字代号 手机物理 ...
- Zabbix 监控触发器设置
简述 在生产环境中,有一台mysql的备份服务器,上面运行着三个数据库实例的从库,也在做日志的同步工作,为了实现对该备份服务器的监控,当出现从库实例不为3或者日志同步进程不为3的时候,产生告警通知,生 ...