您的位置:首页 > 其它

01大背包问题

2018-01-08 18:25 309 查看
题意不变,只不过数据范围变大的01背包问题:

1<=n<=100

1<=vi<=100

1<=wi<=10000000

1<=W<=1000000000

具体代码如下:

#include <stdio.h>
#include <string.h>
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
#define min(x,y) ((x)<(y)?(x):(y))
int n, W;
int v[101];
int w[10000001];
int dp[101][10001];
void solve() {
std::fill(dp[0], dp[0]+10001, inf);
dp[0][0] = 0;
for(int i = 0; i < n; i++) {
for(int j = 0; j <= 10000; j++) {
if(j < v[i]) {
dp[i+1][j] = dp[i][j];
}
else {
dp[i+1][j] = min(dp[i][j], dp[i][j-v[i]] + w[i]);
}
}
}

}
int main() {
scanf("%d%d",&n,&W);
for(int i = 0; i < n; i++) {
scanf("%d%d",&w[i],&v[i]);
}
memset(dp, 0, sizeof(dp));
solve();
int res = 0;
for(int i = 0; i <= 10000; i++) {
if(dp
[i] <= W) res = i;
}
printf("%d\n",res);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: