//这个做着很顺,一下就对了,难道找到感觉了;
//用回朔法,把所有值遍历一遍,取其中最大值即可;
#include"stdio.h"
#include"string.h"
int k,h,a[30],b[30];
int visit[30],max,m;
void bfs(int n,int v,int w,int l)
{
int i;
if(n==k&&v<=h)
{
if(max<w)
max=w;
}
for(i=l;i<=m;i++)
{
if(visit[i]==0&&v+b[i]<=h)
{
visit[i]=1;
bfs(n+1,v+b[i],w+a[i],i+1);
visit[i]=0;
}
}
}
int main()
{
int i,p;
scanf("%d",&p);
while(p--)
{
scanf("%d%d",&m,&k);
memset(visit,0,sizeof(visit));
for(i=1;i<=m;i++)
scanf("%d%d",&a[i],&b[i]);
scanf("%d",&h);
max=0;
bfs(0,0,0,0);
printf("%d\n",max);
}
return 0;
}
dp的做法;
#include<stdio.h>
#include<string.h>
int dp[1005][25];
int a[100],b[100];
int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
int t,m,n,k,i,j,h;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&k);
for(i=0;i<n;i++)
scanf("%d%d",&a[i],&b[i]);
scanf("%d",&m);
memset(dp,0,sizeof(dp));
for(i=0;i<n;i++)
{
for(j=m;j>=b[i];j--)
{
for(h=k;h>0;h--)
{
dp[j][h]=max(dp[j][h],dp[j-b[i]][h-1]+a[i]);
}
}
}
printf("%d\n",dp[m][k]);
}
return 0;
}