洛谷P1048 [NOIP2005 普及组] 采药
思路:
01背包的模板问题,以当前元素选或者不选判断即可。
代码:
#include <iostream>
using namespace std;
const int N = 110;
int T,m;
int t[N],w[N],f[N][1010];
int main()
{
cin >> T >> m;
for (int i = 1; i <= m; i ++ )
{
cin >> t[i] >> w[i];
}
for (int i = 1; i <= m; i ++ )
{
for (int j = 1; j <= T; j ++ )
{
f[i][j] = f[i-1][j];
if (j >= t[i])
{
f[i][j] = max(f[i][j],f[i-1][j-t[i]] + w[i]);
}
}
}
cout << f[m][T] << endl;
return 0;
}
洛谷P1616 疯狂的采药
思路:
完全背包的模板问题,不限次数。记得将数组f
优化成一维数组,防止内存超了。
代码:
#include <iostream>
using namespace std;
typedef long long LL;
const int N = 10000010;
LL T, m;
LL t[N], w[N], f[N];
int main()
{
cin >> T >> m;
for (int i = 1; i <= m; i ++ )
{
cin >> t[i] >> w[i];
}
for (int i = 1; i <= m; i ++ )
{
for (int j = 0; j <= T; j ++ )
{
if(j >= t[i])f[j] = max (f[j], f[j-t[i]]+w[i]);
}
}
cout << f[T] << endl;
return 0;
}
//第i种草药,已经花了j的时间,i种草药在时间范围内采了k个
洛谷P1049 [NOIP2001 普及组] 装箱问题
思路:
这道题一开始不会,看了题解之后写出来的。将题目转化为01背包问题,即多增加一个价值属性(数组w
,w
的值等于其物品的体积),最后在一定的体积内,求出最大的价值即可,然后总体积减去总价值则得到答案。
代码:
#include <iostream>
using namespace std;
const int N = 35;
int v[N], w[N], f[N][200010];
int V, n;
int main()
{
cin >> V >> n;
for (int i = 1; i <= n; i ++ )
{
cin >> v[i];
w[i] = v[i];
}
for (int i = 1; i <= n; i ++ )
{
for (int j = 1; j <= V; j ++)
{
f[i][j] = f[i-1][j];
if (j >= v[i]) f[i][j] = max (f[i][j], f[i-1][j-v[i]] + w[i]);
}
}
cout << V - f[n][V] << endl;
return 0;
}
洛谷P1833 樱花
思路:
这道题也不会,也是后来看题解才会的,并且下面的代码必须开O2
优化,代码才会通过。思路大体就是几个背包模型的一个综合运用。(呜呜呜最近太忙了,所以博客就写得有点水了)
代码:
#include <iostream>
using namespace std;
const int N = 10010;
int t[N], c[N], p[N], f[N], n;
int hh1, mm1, hh2, mm2, T;
int main()
{
scanf("%d:%d", &hh1, &mm1);
scanf("%d:%d", &hh2, &mm2);
T = (hh2-hh1) * 60 + mm2 - mm1;
cin >> n;
for (int i = 1; i <= n; i ++ )
{
cin >> t[i] >> c[i] >> p[i];
}
for (int i = 1; i <= n; i ++ )
{
if (p[i] == 0)
{
for (int j = t[i]; j <= T; j ++)
{
f[j] = max (f[j], f[j-t[i]] + c[i]);
}
}
else
{
for (int k = 1; k <= p[i]; k ++ )
{
for (int j = T; j >= t[i]; j -- )
{
f[j] = max (f[j], f[j-t[i]] + c[i]);
}
}
}
}
cout << f[T] << endl;
return 0;
}