求一道01背包题的AC代码及解释
斯克提斯的鸦人时间限制:1000 ms | 内存限制:65536 KB
描述
据说斯克提斯的鸦人们非常喜欢一种叫做泰罗果的食物。每天早上他们都会派出一个鸦人去采泰罗果。
每个鸦人都有一个背包,有一定的容量。而鸦人们对每个泰罗果的价值定义也有一定的规则。泰罗果越小价值越高。每一个鸦人都希望一次能采到价值最大的泰罗果。
输入
多组测试数据
每组数据3行,第一行2个整数 n (0 <= n <=10000 ), w (0 <= w <=500000 )。表示宝石个数和背包空间。
第二行n个整数vi (i=1,2,……n),表示第i个宝石的价值。(0<= vi <=10000)
第三行n个整数ti (i=1,2,……n),表示第i个宝石的体积。(1<= ti <= w)
数据以-1 -1结束,不必输出结果。
输出
对每一组数据输出一个整数,即能够采到的泰罗果的最大价值。
样例输入
4 7
2 3 4 5
5 4 3 2
-1 -1样例输出
9
我的代码:
程序代码:#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
int w[10003];
int val[10003];
long long c[500003];
int main() {
int num,vol;
long long index;
while(cin >> num >> vol) {
if(num==-1) {
return 0;
}
for(int i = 1; i <= num ; i++) {
scanf("%d",&val[i]);
}
for(int i = 1; i <= num; i++) {
scanf("%d",&w[i]);
}
memset(c,0,sizeof(c[0])*(num + 2));
index = 0;
for(int i = 1; i <=num; i++) {
for(int j =((index + w[i])<500000?index+w[i]:500000); j - w[i] >= 0; j--) {
if(c[j] < c[j-w[i] ]+ val[i])
c[j] = c[j-w[i]] + val[i];
}
index+=w[i];
}
cout << c[vol] << endl;
}
return 0;
}
我用的自滚动数组,但还是超时,不知道问什么,求AC代码
提交地址http://www.









