好像题解大多写的是3层循环,刚刚写了个两层循环的,大佬们康康有漏洞没。
#include<stdio.h>
#include<math.h>
#include<iostream>
using namespace std;
int weight[1005],value[1005],vis[1005],dp[100005],choose[100005][1005];
int main(){ //重量,种类,所属组,每个质量最大价值,
int m,n; //每个质量最优解时每组选择的物品编号
scanf("%d%d",&m,&n);
for(int i=1;i<=n;i++){
scanf("%d%d%d",&weight[i],&value[i],&vis[i]);
}
for(int i=1;i<=n;i++){
for(int j=m;j>=weight[i];j--){
if (j>=weight[i]&&dp[j-weight[i]]+value[i]-value[choose[j][vis[i]]]>dp[j]){
dp[j]=dp[j-weight[i]]+value[i]-value[choose[j][vis[i]]];
choose[j][vis[i]]=i; //选取该物品需除去同类冲突的物品
} //若选取该物品则刷新数组
}
}
printf("%d",dp[m]);
return 0;
}