龙公子重归巅峰

魈凯KBS  •  5个月前


include <bits/stdc++.h>

using namespace std; int m,n,w[1001],c[1001]; //这里是二维数组版本来做0/1背包 int f[1001][1001]; //f[x][y]中,x是物品数量,y是重量。f[x][y]是指在数量为x,重量为y的情况下,最大价值

int main() { cin>>m>>n; for(int i=1; i<=n; i++) {

scanf("%d%d",&w[i],&c[i]);
//输入重量和价值

} for(int i=1; i<=n; i++) {

for(int j=1; j<=m; j++)
{
  //从重量和数量都为一开始枚举,之后不断累积
  if(j>=w[i]) //保证枚举的重量符合条件,不符合就不选,符合才选(所以叫0/1背包)
  {
    f[i][j]=max(f[i-1][j-w[i]]+c[i],f[i-1][j]);//符合的话还要从选和不选再选最大值
  }
  else
  {
    f[i][j]=f[i-1][j];//不符合直接不选,用上一组最大的即可
  }
}

} printf("%d\n\n\n\n\n\n\n\n\n",f[n][m]);//最后输出x=n,y=m的情况,也就是答案 cout<<"你听懂了吗"; return 0; }


评论:

我刚才看了一下这个程序,发现有点问题

建议大家改成这样

include <bits/stdc++.h>

using namespace std;

int w[1001],c[1001],f[1001][1001];

int main() {

int m,n; scanf("%d%d",&m,&n); for(int i=1;i<=n;i++)

scanf("%d%d",&w[i],&c[i]);

for(int i=1;i<=n;i++) //逐个枚举每一件物品

for(int j=1;j<=m;j++) // 枚举个个重量段的别抱
	if(j>=w[i]) //物品i要放入背包
		f[i][j]=max(f[i-1][j-w[i]]+c[i],f[i-1][j]);
	else	f[i][j]=f[i-1][j];

printf("%d\n",f[n][m]); return 0; }


魈凯KBS  •  5个月前

situlibin1234  •  5个月前

situlibin1234  •  5个月前

situlibin1234  •  5个月前

situlibin1234  •  5个月前