Problem : Charm Bracelet
Description:贝茜去珠宝店并且看到了一个好看的手镯,她想把钻石镶在手镯上,每颗钻石都有自己的重量和价值,在手镯所能承受重量的最大范围下问价值的最大值。
Solution:01背包问题(DP),钻石只能选择镶或者不镶,达到最大价值时重量不一定达到手镯所能承受的最大重量。需要注意的是用二维数组的时候会超内存,不过用滚动数组就可以解决这个问题了。
Code(C++)(二维实现) :
#include <iostream>
#include<cstring>
#include<algorithm>
#define N 15000
using namespace std;
int f[2][N];
int a[N],b[N];
int m,n;
int Lcs(int *x,int *y)
{
int i,j;
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
if(j>=x[i])
if(f[(i-1)%2][j-x[i]]+y[i]>f[(i-1)%2][j])
f[i%2][j]=f[(i-1)%2][j-x[i]]+y[i];
else
f[i%2][j]=f[(i-1)%2][j];
else
f[i%2][j]=f[(i-1)%2][j];
}
}
return f[m%2][n];
}
int main()
{
memset(f,0,sizeof(f));
int ans,i;
cin>>m>>n;
for(i=1;i<=m;i++)
{
cin>>a[i]>>b[i];
}
ans=Lcs(a,b);
cout<<ans<<endl;
return 0;
}
Code(C++)(一维实现) :
#include <iostream>
#include<cstring>
#include<algorithm>
#define N 15000
using namespace std;
int f[N];
int main()
{
int m,n,a,b;
int i,j;
memset(f,0,sizeof(f));
cin>>m>>n;
for(i=0;i<m;i++)
{
cin>>a>>b;
for(j=n;j>=a;j--)
if(f[j-a]+b>f[j])
f[j]=f[j-a]+b;
}
cout<<f[n]<<endl;
return 0;
}