这一道题并不难,我们只需要将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 &&(一些记录路径的方法)的更多相关文章

  1. Charlie's Change(完全背包记录路径)

    Charlie is a driver of Advanced Cargo Movement, Ltd. Charlie drives a lot and so he often buys coffe ...

  2. 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 ...

  3. 【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> # ...

  4. POJ 1015 Jury Compromise (记录路径的背包问题)

    (点击此处查看原题) 题意 为了审判某一个人,需要在n个人当中选出m个人组成陪审团,n个人中每个人都有作为起诉方的价值p和作为辩护方的价值d,为了保证公平性,要求m个人作为起诉方的价值之和P和作为辩护 ...

  5. HDOJ-1043 Eight(八数码问题+双向bfs+高效记录路径+康拓展开)

    bfs搜索加记录路径 HDOJ-1043 主要思路就是使用双向广度优先搜索,找最短路径.然后记录路径,找到结果是打印出来. 使用康拓序列来来实现状态的映射. 打印路径推荐使用vector最后需要使用a ...

  6. UVA 674 Coin Change(dp)

    UVA 674  Coin Change  解题报告 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87730#problem/ ...

  7. UVA.674 Coin Change (DP 完全背包)

    UVA.674 Coin Change (DP) 题意分析 有5种硬币, 面值分别为1.5.10.25.50,现在给出金额,问可以用多少种方式组成该面值. 每种硬币的数量是无限的.典型完全背包. 状态 ...

  8. UVA 624(01背包记录路径)

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  9. 训练指南 UVA - 11374(最短路Dijkstra + 记录路径 + 模板)

    layout: post title: 训练指南 UVA - 11374(最短路Dijkstra + 记录路径 + 模板) author: "luowentaoaa" catalo ...

随机推荐

  1. mysql排序,同样的sql,mysql 每次查询结果顺序不一致

    某天项目中写了一句排序sql,但是发现每次执行的结果都不同,就是排序顺序不一样. select * from table_tmp order by printStatus asc,dealTime d ...

  2. Django(五)母版继承、Cookie、视图装饰器等

    大纲 一.内容回顾 补充:默认值 补充:命名空间 二.模板语言 1.母版继承 2.include 3.自定义simple_tag 三.Cookie Cookie 使用总结 四.视图 1.获取用户请求相 ...

  3. Java 写 Log

    . 一个最基本的例子 使用Logging框架写Log基本上就三个步骤 引入loggerg类和logger工厂类 声明logger 记录日志 下面看一个例子 //1. 引入slf4j接口的Logger和 ...

  4. macbook 入门

    前面的话 第一次使用 Mac 之前,需要改变一些原有思维,不应该使用 Windows 的思维习惯去使用 Mac,Mac 会节省系统维护.清理杀毒.升级驱动等操作的时间,让我们可以专注做真正重要的事情, ...

  5. 从输入URL到页面加载的全过程

    前面的话 本文将详细介绍从输入URL到页面加载的全过程 概述 从输入URL到页面加载的主干流程如下: 1.浏览器构建HTTP Request请求 2.网络传输 3.服务器构建HTTP Response ...

  6. java获取文件行数

    public long getLineNumber(File file) { if (file.exists()) { try { FileReader fileReader = new FileRe ...

  7. vue项目笔记

    参考了很多网上其他人的 1.安装 npm与cnpm:npm(node package manager)是nodejs的包管理器,用于node插件管理(包括安装.卸载.管理依赖等):npm可以在node ...

  8. 搭建alpine仓库 提供apk包

    搭建alpine私有仓库从官方拉取alpine所有的包 wget -r -np -nH http://nl.alpinelinux.org/alpine/v3.5/main/x86_64/ wget ...

  9. Android List 排序

    Collections.sort(list, (l1, l2) -> l1.getID().compareTo(l2.getID())); list:泛型集合 l1:比较的前一个泛型 l2:比较 ...

  10. 不转实体直接获取Json字符串中某个字段的值

    JObject jo = (JObject)JsonConvert.DeserializeObject(JsonStr);//JsonStr 为Json字符串 string lng = jo[&quo ...