#define inf -1
#define maxn 201
#define maxv 20000
//numsSize件物品放到一个背包里,如果背包里物品价值是总价值的1/2,则表示可以分成两个等和子集
int opt(int a,int b){
if(a==inf) return b;
if(b==inf) return a;
return a>b?a:b;
}
bool myBag(int n,int* a,int* dp){//dp表示容量为j的背包最大价值是多少
int sumv=0;
for(int i=0;i<n;i++){
sumv+=a[i];
}
if(sumv%2==1) return false;
for(int i=1;i<=maxn;i++){
dp[i]=inf;
}
dp[0]=0;
int maxcapacity=sumv/2;
for(int i=0;i<n;i++){//把编号为i的物品放到容量为j的背包
for(int j=n-1;j>=1&&dp[j-1]+a[i]<=maxcapacity;j--){
dp[j]=opt(dp[j],dp[j-1]+a[i]);//if dp[j]==dp[j]表示该物品不放入背包 if dp[j]=dp[j-1]+a[i]表示这件物品放入背包
if(dp[j]==maxcapacity) return true;
}
}
return false;
}
int dp[maxv];
bool canPartition(int* nums, int numsSize) {
return myBag(numsSize,nums,dp);
}
为什么不对呀🥹

