纯背包问题:找到最大的价值。
方法一(Accept)
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int w[3403];
int val[3403];
int c[12881];
int main(){
int n,m;
while(cin>>n>>m){
memset(w,0,sizeof(w));
memset(val,0,sizeof(val));
for(int i=1;i<=n;i++){
cin>>w[i]>>val[i];
}
memset(c,0,sizeof(c));
for(int i=1;i<=n;i++){
for(int j=m;j>=w[i];j--){
c[j]=max(c[j],c[j-w[i]]+val[i]);
}
}
cout<<c[m]<<endl;
}
return 0;
}
方法二(超时)
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int w[3403];
int val[3403];
int c[3403][12881];
int n,m;
int dp(int index,int v){
if(c[index][v]>0){
return c[index][v];
}
if(index<0||index>n)return 0;
int res=0;
if(w[index]>v){
res=dp(index+1,v);
}else{
res=max(dp(index+1,v),dp(index+1,v-w[index])+val[index]);
}
c[index][v]=res;
return res;
}
int main(){
while(cin>>n>>m){
memset(w,0,sizeof(w));
memset(val,0,sizeof(val));
for(int i=1;i<=n;i++){
cin>>w[i]>>val[i];
}
int res=dp(1,m);
cout<<res<<endl;
}
return 0;
}