转化思维,把价值当成背包容量,选择最小的花费,从上到下枚举,找到当这个最小的花费.
#include<iostream> #include<cstring> #include<cstdio> using namespace std; int main() { int dp[5500],t,b,w[550],v[550],n; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&b); int all = 0; for(int i = 0;i < n;i++) { scanf("%d%d",&w[i],&v[i]); all += v[i]; } memset(dp,0x3f,sizeof(dp)); dp[0] = 0; for(int i = 0;i < n;i++) { if(all >= v[i]) for(int j = all;j >= v[i];j--) dp[j] = min(dp[j],dp[j-v[i]] + w[i]); } int ans = 0; for(int i = all;i >= 0;i--) { if(dp[i] <= b) { ans = i; break; } } printf("%d ",ans); } return 0; }