260 条题解
-
3
2472207427@qq.com LV 8 @ 7 年前
样例过了的提交却全错的同学看:
你们是不是把输入顺序搞反了?
先输入高兴值后输入耗费时间
-
14 年前@
#include<bits/stdc++.h>
using namespace std;
int w[10001],v[10001],a[80003],n,m;
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>v[i]>>w[i];
}
for(int i=1;i<=n;i++){
for(int j=m;j>=w[i];j--){
a[j]=max(a[j],a[j-w[i]]+v[i]);
}
}
cout<<a[m];
return 0;
}
求赞求赞求赞求赞求赞求赞求赞求赞求赞求赞求赞求赞求赞求赞
求赞求赞求赞求赞求赞求赞求赞求赞求赞求赞求赞求赞求赞
求赞求赞求赞求赞求赞求赞求赞求赞求赞求赞求赞求赞
求赞求赞求赞求赞求赞求赞求赞求赞求赞求赞求赞
求赞求赞求赞求赞求赞求赞求赞求赞求赞求赞
求赞求赞求赞求赞求赞求赞求赞求赞求赞
求赞求赞求赞求赞求赞求赞求赞求赞
求赞求赞求赞求赞求赞求赞求赞
求赞求赞求赞求赞求赞求赞
求赞求赞求赞求赞求赞
求赞求赞求赞求赞 -
15 年前@
这是0/1背包问题,每个娱乐项目要么选要么不选,算作动态规划的入门吧。
-
18 年前@
-
19 年前@
#include<iostream>
#include<algorithm>
using namespace std;
int n,t,v[1005][1005],t1[1005],p[1005];
int main()
{
cin>>n>>t;
for(int i=1;i<=n;i++)
{
cin>>p[i]>>t1[i];
}
for(int i=0;i<=t;i++)
v[0][i]=0;for(int i=0;i<=n;i++)
v[i][0]=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=t;j++)
{
if(j>=t1[i])
v[i][j]=max(v[i-1][j-t1[i]]+p[i],v[i-1][j]);
else
v[i][j]=v[i-1][j];
}
cout<<v[n][t]<<endl;return 0;
} -
09 个月前@
明显是一道dp~~(废话)~~
01背包~~难度:4~~
``` -
04 年前@
#inclde <iostream>
using namespace std;
int n,t,f[1001],w[1001],v[1001];
int main()
{
cin>>n>>t;
for(int i=0;i<=n;i++)
cin>>v[i]>>w[i];
for(int i=0;i<=n;i++)
{
for(int j=t;j>=0;j--)
if(j>=w[i])
f[j]=max(f[j],f[j-w[i]]+v[i]);
}
cout<<f[t];
return 0;
} -
04 年前@
01背包
滚动数组 -
05 年前@
#include<iostream>
#include<string.h>
using namespace std;
int f[100];
int main(){
int v,w,t,n;
cin>>n>>t;
memset(f,0,sizeof(f));
while(n--){
cin>>v>>w;
for(int i=t;i>=0;i--){
if(i>=w)f[i]=max(f[i-w]+v,f[i]);
}
}
cout<<f[t]<<endl;
} -
07 年前@
var
f:array[0..1000]of longint;
like,time:array[1..100]of longint;
i,j,n,t:longint;
begin
readln(n);
readln(t);
for i:=1 to n do
readln(like[i],time[i]);
fillchar(f,sizeof(f),0);
for i:=1 to n do
for j:=t downto 1 do
if j-time[i]>=0 then if f[j-time[i]]+like[i]>f[j] then f[j]:=f[j-time[i]]+like[i];
writeln(f[t]);
end. -
08 年前@
手写了一个暴力dp,无任何优化,结果。。。AC了。。
~~~
#include <iostream>
#include <cstdio>
using namespace std;
int n,t,A[105],T[105],F[105][1005];
int main(){
scanf("%d%d",&n,&t);
for(int i = 1;i <= n;i++) scanf("%d%d",&A[i],&T[i]);
for(int i = 1;i <= n;i++)
for(int j = 1;j <= t;j++)
if(j >= T[i]) F[i][j] = max(F[i - 1][j],F[i - 1][j - T[i]] + A[i]);
else F[i][j] = F[i - 1][j];
printf("%d\n",F[n][t]);
return 0;
}#include <iostream>
#include <cstdio>
using namespace std;
int n,t,A,T,F[1005];
int main(){
scanf("%d%d",&n,&t);
for(int i = 1;i <= n;i++) {
scanf("%d%d",&A,&T);
for(int j = t;j >= T;j--) F[j] = max(F[j],F[j - T] + A);
}
printf("%d\n",F[t]);
return 0;
} -
08 年前@
#include <cstdio>
int max(int a,int b){
return a>b?a:b;
}int main(){
// freopen("in.txt","r",stdin);
int n,v;
int c[1000],w[1000];
int f[1000]={0};
scanf("%d%d",&n,&v);
for(int i=1;i<=n;i++)
scanf("%d%d",&w[i],&c[i]);
for(int i=1;i<=n;i++)
for(int j=v;j>=c[i];j--)
f[j]=max(f[j],f[j-c[i]]+w[i]);
printf("%d",f[v]);return 0;
} -
09 年前@
var
a,t:array[1..100]of integer;
f:array[0..100,0..1000]of longint;
mt,n,i,j:integer;
begin
readln(n);
readln(mt);
for i:=1 to n do
readln(a[i],t[i]);
fillchar(f,sizeof(f),0);
for i:=1 to n do
for j:=1 to mt do
begin
f[i,j]:=f[i-1,j];
if (j>=t[i])and(f[i-1,j-t[i]]+a[i]>f[i,j])then
f[i,j]:=f[i-1,j-t[i]]+a[i];
end;
writeln(f[n,mt]);
end. -
09 年前@
#include<cstdio>
int f[1000],n,m,v,p;
int main()
{
scanf("%d%d",&n,&m);
while(n--)
{
scanf("%d%d",&v,&p);
for(int i=m;i>=p;--i)
f[i]=std::max(f[i],f[i-p]+v);
}
printf("%d",f[m]);
return 0;
} -
09 年前@
记忆化搜索(通俗易通啊)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("fin.in");
ofstream fout("fout.out");
int n,t,f[110],h[110],g[1100][110]={0};
void Input()
{
cin>>n>>t;
for(int i=1;i<=n;i++) cin>>f[i]>>h[i];
}
int algorithm(int y,int x){
// fout<<y<<" "<<x<<"\n";
if(x==0||y==0) return 0;
if(g[y][x]) return g[y][x];
int a=0,b;
if(y>=h[x]) a=algorithm(y-h[x],x-1)+f[x];
b=algorithm(y,x-1);
if(a>b) b=a;
g[y][x]=b;
return g[y][x];
}
int main()
{
Input(); //输入
// for(int i=1;i<=10;i++)
// for(int j=1;j<=10;j++)
//fout<<g[i][j];
int m=algorithm(t,n); //算法
cout<<m;
}
递推(总算弄懂了,汗)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("fin.in");
ofstream fout("fout.out");
int n,t,f[110],g[110],h[1010];
void Input()
{
cin>>n>>t;
for(int i=1;i<=n;i++) cin>>f[i]>>g[i];
}
int main()
{
Input(); //输入
for(int i=1;i<=n;i++){
for(int j=t;j>=g[i];j--)
if(h[j]<h[j-g[i]]+f[i]) h[j]=h[j-g[i]]+f[i];
}
cout<<h[t];}
-
09 年前@
求大神指点
-
09 年前@
这哪里错了
var i,j,k,m,n,l,x,y:longint;
a,b:array[0..1000]of longint;
c:array[0..100,0..1000]of longint;
begin
readln(n);
readln(m);
for i:=1 to n do
read(a[i],b[i]);
for i:=1 to n do
begin
for j:=1 to m do
begin
if b[i]>j then
c[i,j]:=c[i-1,j];
if (b[i]=j)and(a[i]>c[i,j]) then
c[i,j]:=a[i];
if (b[i]<j)and(c[i-1,j]>c[i-1,j-b[i]]+a[i]) then
c[i,j]:=c[i-1,j];
if (b[i]<j)and(c[i-1,j]<=c[i-1,j-b[i]]+a[i]) then
c[i,j]:=c[i-1,j-b[i]]+a[i];
end;
end;
write(c[n,m]);
end. -
09 年前@
#include<iostream>
using namespace std;
const int max_place=1000;
const int max_time=1000;
int totaltime;
int totalplace;
int like[max_place];
int timetake[max_place];
int maxlike[max_time][max_place];
int p,t,minitime;int max(int a,int b)
{
if(a>=b) return a;
else return b;
}int mintime(int time[],int p)
{
int i,min=10000;
for(i=0;i<p;i++)
{
if(time[i]<=min) min=time[i];}
return min;
}int GetMaxLike(int time,int placeNum)
{
int retMaxLike;
int minitime=mintime(timetake,p);
if(maxlike[time][placeNum]!=-1)
{
retMaxLike=maxlike[time][placeNum];
}
else if(placeNum==0)
{
if(time>=minitime)
retMaxLike=like[placeNum];
else
retMaxLike=0;
}
else if(time>=timetake[placeNum])
{
retMaxLike=max(GetMaxLike(time-timetake[placeNum],placeNum-1)+like[placeNum],GetMaxLike(time,placeNum-1));
}
else
{
retMaxLike=GetMaxLike(time,placeNum-1);
}
maxlike[time][placeNum] =retMaxLike ;
return retMaxLike;}
int main()
{
for(int i=0; i<max_time; i++)
for(int j=0; j<max_place; j++)
maxlike[i][j] = -1;cin>>p>>t;
for(int i=0;i<p;i++)
{
cin>>like[i];
cin>>timetake[i];
}
cout<<GetMaxLike(t,p-1)<<endl;}
不知道哪儿错了,求指教~~ -
09 年前@
麻烦大神给指导!!!竟然拼写错误!我用pascal代入测试数据是过了的!
uses math;
var n,m w,v,i,j:longint;
dp:array[0..1000,0..1000] of longint;
begin
readln(n);
readln(m);
for i:= 1 to n do
begin
readln(v,w);
for j:= w to m do
dp[i,j]:=max(dp[i-1,j],dp[i-1,j-w]+v);
for j:= 0 to w-1 do
dp[i,j]:=dp[i-1,j];
end;
writeln(dp[n,m]);
end. -
09 年前@
#include <cstdio>
using namespace std;
inline int max(int a,int b) {
return a>b?a:b;
}int main(void) {
int n=0,v=0;
scanf("%d %d",&n,&v);
int w[n],c[n];
for (int i=0;i<n;++i)
scanf("%d %d",w+i,c+i);
int f[v+1];
for (int i=0;i<=v;++i)
f[i]=0;
for (int i=0;i<n;++i)
for (int j=v;j>=0;--j)
if (j>=c[i])
f[j]=max(f[j],f[j-c[i]]+w[i]);
int ans=0;
for (int i=0;i<v+1;++i)
if (f[i]>ans)
ans=f[i];
printf("%d\n",ans);
return 0;
}QwQ我好菜