#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1010;
ll lose[maxn],win[maxn],use[maxn];
ll f[maxn][maxn];
int main()
{
int n,x;
cin>>n>>x;
for(int i=1;i<=n;++i){
scanf("%ld%ld%ld",&lose[i],&win[i],&use[i]);
}
for(int i=1;i<=n;++i){
for(int j=0;j<=x;++j){
if(j-use[i]>=0) f[i][j]=max(f[i-1][j]+lose[i],f[i-1][j-use[i]]+win[i]);
else f[i][j]=f[i-1][j]+lose[i];
}
}
cout<<f[n][x]*5<<endl;
return 0;
}
洛谷P1002
DFS做法:(TLE两个点)
#include<bits/stdc++.h>
using namespace std;
const int maxn=30;
int n,m,xm,ym,cnt;
int dx[]={1,0},dy[]={0,1};
bool book[maxn][maxn];
void dfs(int x,int y){
if(x==n&&y==m){
cnt++;
return;
}
if(book[x][y]||x>n||y>m) return;
for(int i=0;i<2;++i){
int nx=x+dx[i],ny=y+dy[i];
if(!book[nx][ny]&&nx<=n&&ny<=m) dfs(nx,ny);
}
}
int main()
{
cin>>n>>m>>xm>>ym;
book[xm][ym]=true;
int dx[]={2,1,-1,-2,-2,-1,1,2},dy[]={1,2,2,1,-1,-2,-2,-1};
for(int i=0;i<8;++i){
if(xm+dx[i]>=0&&ym+dy[i]>=0) book[xm+dx[i]][ym+dy[i]]=true;
}
dfs(0,0);
cout<<cnt<<endl;
return 0;
}
DP做法:
#include<bits/stdc++.h>
using namespace std;
const int maxn=300;
unsigned long long f[maxn][maxn];
bool book[maxn][maxn];
int main()
{
int n,m,mx,my;
cin>>n>>m>>mx>>my;
book[mx][my]=true;
int dx[]={2,1,-1,-2,-2,-1,1,2},dy[]={1,2,2,1,-1,-2,-2,-1};
for(int i=0;i<8;++i) book[mx+dx[i]][my+dy[i]]=true;
f[0][0]=1;
for(int i=0;i<=n;++i){
for(int j=0;j<=m;++j){
if(!book[i][j]) f[i][j]=max(f[i-1][j]+f[i][j-1],f[i][j]);
}
}
cout<<f[n][m]<<endl;
return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int maxn=1100;
int f[maxn];
int a[maxn],b[maxn];
int main()
{
int t,m;
cin>>t>>m;
for(int i=1;i<=m;++i){
scanf("%d%d",&a[i],&b[i]);
}
for(int i=1;i<=m;++i){
for(int j=a[i];j<=t;++j){
f[j]=max(f[j],f[j-a[i]]+b[i]);
}
}
cout<<f[t]<<endl;
return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int maxn=40;
int dp[maxn];
int num[maxn],pre[maxn];
bool book[maxn][maxn];
int ans,pos,n;
void print(int x){
if(pre[x]) print(pre[x]);
cout<<x<<" ";
}
int main()
{
cin>>n;
for(int i=1;i<=n;++i){
cin>>num[i];
dp[i]=num[i];
}
for(int i=1;i<=n-1;++i){
dp[i]=num[i];
for(int j=i+1;j<=n;++j){
cin>>book[i][j];
}
}
for(int i=1;i<=n;++i){
dp[i]=num[i];
for(int j=1;j<i;++j){
if(book[j][i]&&dp[i]<dp[j]+num[i]){
dp[i]=dp[j]+num[i];
pre[i]=j;
}
}
if(ans<dp[i]){
ans=dp[i];
pos=i;
}
}
print(pos);
cout<<endl<<ans<<endl;
return 0;
}