专栏文章

题解:P1060 [NOIP2006 普及组] 开心的金明

P1060题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miqi0ybl
此快照首次捕获于
2025/12/04 05:08
3 个月前
此快照最后确认于
2025/12/04 05:08
3 个月前
查看原文
洛谷P1060
本题是一个典型的 01 背包问题,可转化为每个物品的重量 vivi ,价值为 vi×wivi×wi ,背包总容量为 NN 。 设 f[i][j]f[i][j] 表示当处理到第 ii 件物品时,还有 jj 的空间时所获的的价值(第 ii 件物品可以选择取或者不取),可得状态转移方程:
f[i][j]=min(f[i1][j],f[i1][jvj]+vi×wi)f[i][j]=\min(f[i-1][j],f[i-1][j-vj]+vi\times wi)
再用滚动数组优化空间,时间复杂度为 O(N2)O(N^2) ,空间复杂度为 O(N)O(N)
完结散花!
CPP
#include <bits/stdc++.h>
using namespace std;
int f[30001],v[26],w[26],n,m;
int main(){
  	cin>>n>>m;
  	for (int i=1;i<=m;i++){
      	cin>>v[i]>>w[i];
    }
  	for (int i=1;i<=m;i++){
      	for (int j=n;j>=v[i];j--){
          	f[j]=max(f[j],f[j-v[i]]+v[i]*w[i]);
        }
    }
  	cout<<f[n]<<endl;
  	return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...