#include<iostream> #include<algorithm> #include<cmath> using namespace std; int max(int a,int b){return a>b?a:b;} int map[1003][1003],T,n,input[103][2]; //图表 int f(int xx,int yy){ if(xx<=0 || yy<0)return 0;//如果在此范围内为0 else{ if(map[yy][xx]!=0)return map[yy][xx]; int temp=xx-input[yy][0];//目前背包是否可容下当前物品 if(temp>=0){//可以的话 temp=f(xx-input[yy][0],yy-1)+input[yy][1]; //计算装这个的话最大是多少 }else{temp=0;} int temp1=max(f(xx,yy-1),temp); return map[yy][xx]=temp1; //对比装不装的结果 } } int main(){ int i; cin>>T>>n; for(i=0;i<n;i++)cin>>input[i][0]>>input[i][1]; cout<<f(T,n-1); if(0){//输出建立的表格 cout<<" "; for(i=0;i<T;i++)cout<<i+1<<" "; cout<<endl; for(i=0;i<n;i++){ cout<<input[i][0]<<" "; for(int xx=1;xx<=T;xx++){ cout<<map[i][xx]<<" "; } cout<<endl; } } return 0; }
https://www.luogu.com.cn/problem/P1048