poj 3624 Charm Bracelet(0-1背包~DP~)

0-1背包~~~

 

我是基本原理理解差不多了,就是没自己写过。。。今晚自己写了。写完蛮不自信的,还找代码对了对,居然对着类,哦也~~

 

具体分析详见背包九讲~~~

 

背包啊背包。。。大家天天都背包。。。= =。。。

 

这个题二维的大啊,大致算下,得超内存吧,13000*13000*4/1024 > 65535 。。。

 

今天光棍节,外面有男生在鬼吼 = =。。。真是一群寂寞的人呢。。。呵呵。。

 

我去拿二维写写去。。。

 

写了,二维还没一维的好写= =。。。果然超内存了。。。贴上来吧。恩。

 

一维的

 

#include <stdio.h> #include <stdlib.h> #include <iostream> #include <string.h> using namespace std; int bag[12900]; int w[3410],v[3410]; int main(void) { int n,m; cin >> n >> m; for(int i=1; i<=n; i++) cin >> w[i] >> v[i]; memset(bag,0,sizeof(bag)); for(int i=1; i<=n; i++) for(int k=m; k>=w[i]; k--) if( bag[k-w[i]]+ v[i] > bag[k] ) bag[k] = bag[k-w[i]]+ v[i]; cout << bag[m] << endl; return 0; }  

 

二维的,数组开100可以。。。可以出来答案。。但是不满足题意啊。。

#include <stdio.h> #include <stdlib.h> #include <iostream> #include <string.h> using namespace std; int bag[100][100]; int w[3410],v[3410]; int main(void) { int n,m; cin >> n >> m; for(int i=1; i<=n; i++) cin >> w[i] >> v[i]; memset(bag,0,sizeof(bag)); for(int i=1; i<=n; i++) for(int k=1; k<=m; k++) if( k >= w[i]) { if( bag[i-1][k-w[i]]+ v[i] > bag[i-1][k] ) bag[i][k] = bag[i-1][k-w[i]]+ v[i]; else bag[i][k] = bag[i-1][k]; } else bag[i][k] = bag[i-1][k]; cout << bag[n][m] << endl; return 0; }  

你可能感兴趣的:(poj 3624 Charm Bracelet(0-1背包~DP~))