01背包问题
分为二维还是一维模板不同
此题二维会炸要用一维存储的使其通过
初学
一定要学会看题目范围 像zzc说的范围过大就直接暴力
洛谷P2871 [SACO07DEC]手链Charm Bracelet
https://www.luogu.org/problemnew/show/P2871
#include<stdio.h>
#include<bits/stdc++.h>
const int maxn=19999;
//int a[maxn][maxn];
using namespace std;
int v[maxn];///价值
int w[maxn];///容量
int V[maxn][maxn];
int B[maxn];
int FindMaxBetter(int number,int capacity)//优化空间后的动态规划
{
int i,j;
for(i=1;i<=number;i++)
{
for(j=capacity;j>=w[i];j–)
{
if(B[j]<=B[j-w[i]]+v[i])//二维变一维
{
B[j]=B[j-w[i]]+v[i];
}
//B[j]=max(B[j],B[j-w[i]]+v[i]); ///二维变一维的另一种方法
}
}
return B[capacity];
}
int main()
{
int n,m;
cin>>n>>m;
for(int j=1; j<=n; j++)///划重点 一定要重数组下标为1开始 ///WA了两次看完题解才知道是读入错误
{
cin>>w[j]>>v[j];
}
int c=FindMaxBetter(n,m);
cout<<c<<endl;
}
/
P2639 [USACO09OCT]Bessie的体重问题Bessie’s We…
https://www.luogu.org/problemnew/show/P2639
一样的01背包问题知识需要简单的更改一下数据多考虑几分钟就可以搞出来 但是此题需要注意范围45000
#include<stdio.h>
#include<bits/stdc++.h>
const int maxn=59999;
//int a[maxn][maxn];
using namespace std;
int v[maxn];///价值
int w[maxn];///容量
//int V[maxn][maxn];
int B[maxn];
int FindMaxBetter(int number,int capacity)//优化空间后的动态规划
{
int i,j;
for(i=1;i<=number;i++)
{
for(j=capacity;j>=w[i];j–)
{
if(B[j]<=B[j-w[i]]+v[i])//二维变一维
{
B[j]=B[j-w[i]]+v[i];
}
//B[j]=max(B[j],B[j-w[i]]+v[i]);
}
}
return B[capacity];
}
int main()
{
int n,m;
cin>>n>>m;
for(int j=1; j<=m; j++)///不同之处 将重量和价值使其相等就ok
{
cin>>w[j];
v[j]=w[j];
}
int c=FindMaxBetter(m,n);
cout<<c<<endl;
}