两层循环也过了,帮忙看看有没有问题
查看原帖
两层循环也过了,帮忙看看有没有问题
577391
HUAJIDAFA楼主2021/11/3 22:30

好像题解大多写的是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;
}
2021/11/3 22:30
加载中...