203 条题解
-
7
lshstc LV 8 @ 8 年前
#include <iostream>
using namespace std;
int v[30050],w[30050],s[30050],dp[30050];
int main() {
int i,j,n,m;
cin>>m>>n;
for(i=1;i<=n;i++){
cin>>w[i]>>v[i];
}
for(i=1;i<=n;i++){
for(j=m;j>=w[i];j--){
dp[j]=max(dp[j],dp[j-w[i]]+v[i]*w[i]);
}
}
cout<<dp[m];
return 0;
} -
38 年前@
01背包。
-
24 年前@
背包问题主要是背模板,这里收录了一些模板
一些复杂的背包问题(如泛化物品)未收录
01背包问题:
无优化
一维数组优化:
更进一步的常数优化:
完全背包问题:
多重背包问题:
下面来到我们的正题: 首先判断是否为背包问题,可见其背包就是money的总数,质量就是重要度*money
可以套用背包问题
有根据其特性可知这是01背包
到此建模完成,思考+读题用时3min
求赞
-
28 年前@
良心AC
/*
algorithm:Zero_One_Pack
written by wx
time:2016/10/16 4:05
/
#include <stdio.h>
using namespace std;
int max(int a,int b)
{
if(a>b)return a;
return b;
}
int main()
{
int n,v,cost[30],g[30],i,j,f[30001]={};
scanf("%d%d",&v,&n);
for(i=1;i<=n;i++)
{
scanf("%d%d",&cost[i],&g[i]);
g[i]=cost[i];
}
for(i=1;i<=n;i++)
{
for(j=v;j>=cost[i];j--)
f[j]=max(f[j],f[j-cost[i]]+g[i]);
}
printf("%d",f[v]);
return 0;
} -
13 年前@
-
14 年前@
必过
#include<bits/stdc++.h>
using namespace std;
long long w[10001],v[10001],a[802003],n,m;
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>w[i]>>v[i];
}
for(int i=1;i<=m;i++){
for(int j=n;j>=w[i];j--){
a[j]=max(a[j],a[j-w[i]]+v[i]*w[i]);
}
}
cout<<a[n];
return 0;
} -
17 年前@
裸的01背包...
-
17 年前@
//题目中价值和重要度乘起来,就相当于01背包中de价值;
//题目中的价值相当于01背包的重量,然后这就是一个模板题;
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
int wr[26][30000];
int im[26];
int zi[26];
int v[26];
int main()
{int mem,n;
cin>>mem>>n;
for(int i=1;i<=n;i++)
{
cin>>v[i]>>im[i];
}
memset(wr,0,sizeof(wr));
for(int i=1;i<=n;i++)
zi[i]=v[i]*im[i];
for(int i=1;i<=n;i++)
{
for(int j=mem;j>=0;j--)
{if(j>=v[i])wr[i][j]=max(wr[i-1][j-v[i]]+zi[i],wr[i-1][j]);
else wr[i][j]=wr[i-1][j];
}
}cout<<wr[n][mem];
return 0;
} -
04 年前@
-
04 年前@
dp万岁!!!
-
07 年前@
-
07 年前@
典型的01背包
#include<bits/stdc++.h>
using namespace std;
int n,m,val,like;
int f[30001];int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;++i){
scanf("%d%d",&val,&like);
for(int j=n;j>=val;--j){
f[j]=max(f[j],f[j-val]+val*like);
}
}
printf("%d",f[n]);
return 0;
} -
07 年前@
#include <iostream>
/* run this program using the console pauser or add your own getch, system("pause") or input loop /
using namespace std;
int s[30][300010]={}; //定义一个存储数组
int main(int argc, char* argv)
{
int m,n,a[30]={0},b[30]={0},i,j;
cin>>m>>n;
for(i=1;i<=n;i++)
{
cin>>a[i]>>b[i]; //循环输入价格数组a[i]和重要成度数组b[i]
}
for(i=1;i<=n;i++)
{
for(j=0;j<=m;j++) //双重循环 循环 1~1000(输入实例)
{
if(j>=a[i]) //如果j大于a[i](商品价格)
s[i][j]=max(s[i-1][j],s[i-1][j-a[i]]+a[i]*b[i]); //比较【下一件商品】和【下一件商品的1~1000-物品价格】(max是指比较两个中最大的那个数,地球人都知道,哈哈)
else
s[i][j]=s[i-1][j]; //否则,把下一件商品赋值给s[i][j];
}
}
cout<<s[n][m-1]; //输出结果
return 0;
} -
07 年前@
#include<iostream>
using namespace std;
int v[26]={0},p[26]={0};
int f[26][30010]={0};
int main()
{
int m,n;
cin>>m>>n;
for(int i=1;i<=n;i++)
{
cin>>v[i]>>p[i];
}
for(int i=1;i<=n;i++)
for(int V=0;V<=m;V++)
{
if(V>=v[i])
f[i][V]=max(f[i-1][V],f[i-1][V-v[i]]+p[i]*v[i]);
else
f[i][V]=f[i-1][V];
}
cout<<f[n][m-1];
return 0;
} -
08 年前@
#include <iostream>
using namespace std;
int v[30050],w[30050],s[30050],dp[30050];
int main() {
int i,j,n,m;
cin>>m>>n;
for(i=1;i<=n;i++){
cin>>w[i]>>v[i];
}
for(i=1;i<=n;i++){
for(j=m;j>=w[i];j--){
dp[j]=max(dp[j],dp[j-w[i]]+v[i]*w[i]);
}
}
cout<<dp[m];
return 0;
} -
08 年前@
-
08 年前@
#include<cstdio>
using namespace std;
long long n,m,v[1000001],p[1000001],f[1000001];
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)scanf("%d%d",&v[i],&p[i]);
for(int i=1;i<=m;i++)
{
for(int j=n;j>=v[i];j--)
{
if(f[j-v[i]]+v[i]*p[i]>f[j])f[j]=f[j-v[i]]+v[i]*p[i];
}
}
printf("%d\n",f[n]);
} -
08 年前@
-
08 年前@
var m,n,i,j:longint;
k,v:array[1..25] of longint;
f:array[0..1000000] of longint;
begin
readln(m,n);
for i:=1 to n do
readln(k[i],v[i]);
for i:=1 to n do
for j:=m downto k[i] do
if f[j-k[i]]+k[i]*v[i]>f[j] then
f[j]:=f[j-k[i]]+k[i]*v[i];
writeln(f[m]);
end. -
08 年前@
暴搜略剪枝
#include <iostream>
using namespace std;
int t=0,w[1000],v[1000], c,k;
void bs(int bj, int p,int c)
{
if(c<=0)
return;
if(bj>k){
t=max(t,p);
return;
}
else{
bs(bj+1,p+w[bj],c-v[bj]);
bs(bj+1,p,c);
}
}
int main()
{
cin>>c>>k;
int i;
for(i=1;i<=k;i++){
cin>>v[i]>>w[i];
w[i]=w[i]*v[i];
}
bs(1,0,c);
cout<<t;
return 0;
}