#include<iostream>
#include<cstdio>
using namespace std;
int sum=0;
void getMax(int N,int ** array,int Limit,int happiness)
{
if(Limit==0)
{
if(happiness > sum) sum = happiness;
return;
}
if(Limit < 0) return ;
else
{
for(int i=0;i<N;i++){
if((Limit -array[i][1])<0)
{
if(happiness > sum) sum = happiness;
}
happiness += array[i][0];
getMax(N,array,Limit-array[i][1],happiness);
happiness -= array[i][0];
}
}
}
int main()
{
int N;
int **array;
int Limit;
while(scanf("%d",&N)!=EOF){
array= new int *[N];
for(int i=0;i<N;i++)
array[i] = new int[2];
for(int i=0;i<N;i++)
cin>>array[i][0]>>array[i][1];
cin>>Limit;
getMax(N,array,Limit,0);
cout<<sum<<endl;
}
return 0;
}

上面超时了



因为每种东西可以不只取一次,所以是一道完全背包题


#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int dp[100006];
int main()
{
int t;
while(~scanf("%d",&t)){
memset(dp,0,sizeof(dp));
int i,j,aim;
int ka[105],val[105];
for(i=0;i<t;i++)
scanf("%d%d",&val[i],&ka[i]);
scanf("%d",&aim);
for(i=0;i<t;i++){
for(j=ka[i];j<=aim;j++)
{
dp[j]=max(dp[j],dp[j-ka[i]]+val[i]);
}
}
printf("%d\n",dp[aim]);
}
return 0;
}