这一道题并不难,我们只需要将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. 【DeepLearning】优化算法:SGD、GD、mini-batch GD、Moment、RMSprob、Adam

    优化算法 1 GD/SGD/mini-batch GD GD:Gradient Descent,就是传统意义上的梯度下降,也叫batch GD. SGD:随机梯度下降.一次只随机选择一个样本进行训练和 ...

  2. Helicute FPV App Privacy Policy

    Personal Data collected for the following purposes and using the following services: Device permissi ...

  3. 【LUOGU???】WD与地图 整体二分 线段树合并

    题目大意 有一个简单有向图.每个点有点权. 有三种操作: 修改点权 删除一条边 询问和某个点在同一个强连通分量中的点的前 \(k\) 大点权和. \(n\leq 100000,m,q\leq 2000 ...

  4. mac 下 clang++ 找不到头文件 stdlib.h

    因为要用 openmp库,用 clang++ 编译 c++程序,出现了如下报错: clang++ xx.cpp -o xx -fopenmp /usr/local/Cellar/llvm/7.0.0/ ...

  5. ES6中6种声明变量的方法

    相关阅读:http://es6.ruanyifeng.com/#docs/let 相关阅读:https://www.cnblogs.com/ksl666/p/5944718.html 相关阅读:htt ...

  6. Re.多项式求逆

    前言 emmm暂无 多项式求逆目的 顾名思义 就是求出一个多项式的摸xn时的逆 给定一个多项式F(x),请求出一个多项式G(x),满足F(x)∗G(x)≡1(modxn),系数对998244353取模 ...

  7. python 2.x 与3.x 的区别总结

    宏观上:2.x 源码不规范,混乱,冗余. 3.x 源码优美清晰,统一标准,去除了冗余.   默认编码方式:2.x ASCII码  3.x UTF-8 用2.x 处理中文时,需要声明编码方式(由于cmd ...

  8. MATLAB模型预测控制(MPC,Model Predictive Control)

    模型预测控制是一种基于模型的闭环优化控制策略. 预测控制算法的三要素:内部(预测)模型.参考轨迹.控制算法.现在一般则更清楚地表述为内部(预测)模型.滚动优化.反馈控制. 大量的预测控制权威性文献都无 ...

  9. css解决内联元素间的空白间隔

    在内联元素的父级元素上设置font-size: 0px;即可.例如: <div class="wrap"> <ul> <li class=" ...

  10. 在linux服务器上搭建nvidia-docker环境

    docker相当于一个容器,其可以根据你所需要的运行环境构建相应的运行环境,此时各个环境之间彼此隔离,就不会存在在需要跑一个新的代码的时候破坏原来跑的代码所需要的环境,各个环境之间彼此隔离开,好像一个 ...