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;
}
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;
}