POJ 3624 Charm Bracelet O1背包

#include <set>
#include <map>
#include <list>
#include <cmath>
#include <ctime>
#include <deque>
#include <queue>
#include <stack>
#include <cctype>
#include <cstdio>
#include <string>
#include <vector>
#include <cassert>
#include <cstdlib>
#include <cstring>
#include <sstream>
#include <iostream>
#include <algorithm>
using namespace std;
int w[3500],v[3500],f[13000];
int max(int i,int j){return i>j?i:j;}
int main()
{
//	freopen("in.txt","r",stdin);
	int n,m,i,j;
	cin>>n>>m;				//n is number of item ,m is total weight
	for(i=1;i<=n;i++)	
		cin>>w[i]>>v[i];    // w is weight , v is value of item
	for(i=1;i<=n;i++)
		for(j=m;j>=w[i];j--)
			f[j]=max(f[j],f[j-w[i]]+v[i]);
	cout<<f[m]<<endl;
	return 0;
}

看上去很短但是主要就是一个DP函数


for(i=1;i<=n;i++)
		for(j=m;j>=w[i];j--)
			f[j]=max(f[j],f[j-w[i]]+v[i]);

主要就是 “最佳状态取第I个物品” 和 “不取它的状态” 进行max


看了下背包九讲立马就懂了

posted @ 2012-07-14 17:07  Felix_F  阅读(121)  评论(0编辑  收藏  举报