"""
第5课 开心的金明《聪明人的游戏:信息学探秘.提高篇》(优化空间)
https://www.luogu.org/problemnew/show/P1060
"""
v=[0]*30
w=[0]*30
f=[0]*30005
n,m=map( int, input().split() )
for i in range( 1, m+1 ):
x,y=map( int, input().split() )
v[i]=x
w[i]=y
for i in range( 1,m+1 ):
j=n
while j>=v[i]:
f[j]=max( f[j],f[ j-v[i] ]+v[i]*w[i] )
j-=1
print( f[n] )
/*
作业:6选3或6选2
1.采药(medic)
https://www.luogu.org/problemnew/show/P1048
http://ybt.ssoier.cn:8088/problem_show.php?pid=1932
1290:采药
http://ybt.ssoier.cn:8088/problem_show.php?pid=1290
1932:【05NOIP普及组】采药
http://ybt.ssoier.cn:8088/problem_show.php?pid=1932
2.1267:【例9.11】01背包问题
http://ybt.ssoier.cn:8088/problem_show.php?pid=1267
3.NOIP2001普及组 第4题 P1049 装箱问题(0/1 背包或枚举)
https://www.luogu.org/problemnew/show/P1049
4、1.6编程基础之一维数组_04:数组逆序重放
http://noi.openjudge.cn/ch0106/04/
5、1.6编程基础之一维数组_09:向量点积计算
http://noi.openjudge.cn/ch0106/09/
6、题单广场
https://www.luogu.com.cn/training/list
*/
方法一:二维数组01背包 C++代码
#include <bits/stdc++.h>
using namespace std;
int n,m,v[30],w[30],f[30][30010];
int main()
{
//第1行,为两个正整数,用一个空格隔开:N和m(其中N(<30000)
//表示总钱数,m(<25)为希望购买物品的个数。)
cin>>n>>m;
//从第2行到第m+1行,第j行给出了编号为j-1的物品的基本数据,
//每行有2个非负整数v和p(其中v表示该物品的价格(v≤10000),
//p表示该物品的重要度(1~5))
for(int i=1;i<=m;i++)
{
cin>>v[i]>>w[i];
}
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
{
if( j >= v[i] )
{
f[i][j]=max(f[i-1][j],f[i-1][j-v[i]]+v[i]*w[i]);
}
else
{
f[i][j]=f[i-1][j];
}
}
//只有一个正整数,为不超过总钱数的物品的价格
//与重要度乘积的总和的最大值(<100000000)。
cout<<f[m][n]<<endl;
return 0;
}
方法二:优化空间 C++代码
#include <bits/stdc++.h>
using namespace std;
int v[10000+10],w[10];
int main( void )
{
int n,m;
//n最大总价值 m种物品
cin>>n>>m;
for(int i=1;i<=m;++i)
{
// w weight重要程度 v value 价格
cin>>v[i]>>w[i];
}
for(int i=1;i<=m;++i)
for(int j=1;j<=n;++j)
{
if(j>=v[i])
{
f[i][j]=max(f[i-1][j],f[i-1][j-v[i]]+v[i]*w[i]);
//f[i-1][j]:不选第i件物品
//f[i-1][j-v[i]]+v[i]*w[i]:选第i件物品
}
else
{
//因为j<v[i],如果选第i件物品的话会超过j的值
//所以肯定不能先第i件物品
f[i][j]=f[i-1][j];
}
}
cout<<f[m][n]<<endl;
return 0;
}
作业:6选3或6选2
1.采药(medic)
1290:采药
1932:【05NOIP普及组】采药
2.1267:【例9.11】01背包问题
3.NOIP2001普及组 第4题 P1049 装箱问题(0/1 背包或枚举)
4、1.6编程基础之一维数组_04:数组逆序重放
5、1.6编程基础之一维数组_09:向量点积计算
6、题单广场