题目链接:http://poj.org/problem?id=3624
题目描述:有 n 个宝石,对于宝石 i 给出其重量w [ i ] ,价值 d [ i ] ,给出手镯能承载的最大质量 m ,问手镯最大价值?
解题思路:
最简单赤裸的 0-1 背包,但我想了两天才想明白!靠的是我代码里那个test函数。可见利用解析大神代码的方式来学习理解更有效!
直接上图。
对于数据:
4 6
1 4
2 6
3 12
2 7
输出结果:
对于数据:
4 6
1 4
2 7
3 12
2 6
输出结果:
AC代码:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int dp[20000],w[4000],d[4000];
int N,M;
void test(int i)
{
cout<<"w: "<<w[i]<<" "<<"d: "<<d[i]<<endl;
for(i=1;i<=M;i++)
{
cout<<i<<" ";
}
cout<<endl;
for(i=1;i<=M;i++)
{
cout<<dp[i]<<" ";
}
cout<<endl;cout<<endl;
}
int main()
{
//freopen("3624_input.txt","r",stdin);
int i,j,ans=-1;
memset(dp,0,sizeof(dp));
scanf("%d%d",&N,&M);
for(i=1;i<=N;i++)
{
cin>>w[i]>>d[i];
}
for(i=1;i<=N;i++)
{
for(j=M;j>=w[i];j--)
{
dp[j]=max(dp[j],dp[j-w[i]]+d[i]);
ans=max(ans,dp[j]);
}
//test(i);
}
cout<<ans<<endl;
return 0;
}
AC截图: