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
看了下背包九讲立马就懂了