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 ...
随机推荐
- window.open() & iframe & tab
window.open() & iframe & tab window.open() open pages in the same window / tab https://stack ...
- python高级编程笔记一 正则表达式
事例
- Ffmpeg使用
ffmpeg官网 刚开始安装的推荐博客|--利用FFmpeg 开发音视频流:一.二.三 1.分辨率码率 主要视频格式与码率: 分辨率 200p——对应的码率是256kpbs,也就是说,一分钟需要流量1 ...
- anaconda相关使用方法
本文不涉及anaconda的安装,如果需要请自行搜索,cnblogs和CSDN都挺多的. conda安装完,大部分人都jupyter notebook的使用需求,jupyter的开启命令是什么呢? j ...
- java常用类-上
一,常用类之一包装类 java开发中习惯把八大基本数据类型封装到一个类中,并提供属性和方法,更方便的操作基本数据类型. 包装类的出现并不是用于取代基本数据类型,也取代不了. 包装类位于java.lan ...
- Flask 构建微电影视频网站(六)
会员模块实现 会员注册 class RegistForm(FlaskForm): name = StringField( label="昵称", validators=[ Data ...
- LIS ZOJ - 4028
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4028 memset超时 这题竟然是一个差分约束 好吧呢 对于每一个a[i] ...
- Gym - 101982F Rectangles (扫描线+线段树)
链接:http://codeforces.com/gym/101982/attachments 思路: 问被覆盖次数为奇数次的矩阵的面积并 扫描线求矩阵面积并我们是上界赋为-1,下界赋为1,因为要求覆 ...
- foreach 中获取索引index的方法
一样,很少用到,记下来先 主要代码: foreach (var item in arr) { int index = arr.indexOf(item); //index 为索引值 }
- Codeforces 1092C Prefixes and Suffixes(思维)
题目链接:Prefixes and Suffixes 题意:给定未知字符串长度n,给出2n-2个字符串,其中n-1个为未知字符串的前缀(n-1个字符串长度从1到n-1),另外n-1个为未知字符串的后缀 ...