懵逼树上懵逼果,,,代码中的问号至今不懂。。。。
#include <iostream>
#include <string.h>
using namespace std;
const int N = 1010;
const int V = 1010;
int value[N];
int volume[N];
int dp[V];
int T;
int main(){
scanf("%d",&T);
// cout<<"T:"<<T<<endl;
int n=0,v=0;
while(T--){
//cout<<"T:"<<T<<endl;
scanf("%d %d",&n,&v);
// int value[n+1]={0};//必须放在循环里面,不然上一次的值会影响下一次? 不会的,因为每次都只用n个
// int volume[n+1]={0};//放在里面就不会错
// int dp[v+1]={0};//+1啊!!!!!!!!!!!!!!! 用这种方式的话,T全程都是对的,为啥??
//cout<<"T:"<<T<<endl; //T还是对的
value[N]={0}; //但是定义放在外面,初始化放在里面就会错,为什么?
volume[N]={0};//为啥不行呢?不行的是dp,因为这样赋值,只是第一个值为0,其他值还为上一次的值,所以 不对
//dp[V]={0};
memset(dp,0,sizeof(dp));
//cout<<"T:"<<T<<endl;//T不对了,变成0了,为什么?如果上dp初始化为1的话,则T也会变成1,也就是dp给T赋值了,why???????
//??????????????????????????????????????????????????????????
//为什么dp数组会给T赋值呢?? 如果用memset赋值就不会错,那说明两个的空间没有交叉啊,
//确实,用memset的话,则这么在里面赋值也不会出错了,为啥呢??
for(int i=1;i<=n;i++){
scanf("%d",&value[i]);
}
for(int i=1;i<=n;i++){
scanf("%d",&volume[i]);
}
for(int i=1;i<=n;i++){
for(int j=v;j>=volume[i];j--){
//if(j>=volume[i]){//这里是大于等于!!!!!等于也可能啊,之前的都不放,只放这一个。
dp[j]=max(dp[j],dp[j-volume[i]]+value[i]);//为什么是dp[j]?
//}
}
}
printf("%d\n",dp[v]);
}
return 0;
}