您的位置:首页 > 其它

01背包问题。

2012-10-07 22:19 323 查看
pku 3624 Charm Bracelet

http://poj.org/problem?id=3624

最裸的01背包。

View Code

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <string>

#define CL(a,num) memset((a),(num),sizeof(a))
#define iabs(x)  ((x) > 0 ? (x) : -(x))
#define Min(a , b) ((a) < (b) ? (a) : (b))
#define Max(a , b) ((a) > (b) ? (a) : (b))

#define ll __int64
#define inf 0x7f7f7f7f
#define MOD 100000007
#define lc l,m,rt<<1
#define rc m + 1,r,rt<<1|1
#define pi acos(-1.0)
#define test puts("<------------------->")
#define maxn 100007
#define M 15007
#define N 25
using namespace std;
//freopen("din.txt","r",stdin);

int dp
[M];
int pos
,g
;

const int L = 7500;

int main(){
//freopen("din.txt","r",stdin);
int i,j,k;
int n,m;
scanf("%d%d",&n,&m);
for (i = 1; i <= n; ++i) scanf("%d",&pos[i]);
for (i = 1; i <= m; ++i) scanf("%d",&g[i]);

CL(dp,0);
for (i = 1; i <= n; ++i){
dp[1][g[1]*pos[i] + L]++;
}
for (i = 2; i <= m; ++i){
for (j = 0; j <= 15000; ++j){
if (dp[i - 1][j]){
for (k = 1; k <= n; ++k){
dp[i][j + pos[k]*g[i]] += dp[i - 1][j];
}
}
}
}
printf("%d\n",dp[m][7500]);
return 0;
}


更新中。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: