一个完全背包,数组两百万,暴力可过
#include<iostream> #include<cstdio> #include<cstring> using namespace std; #define maxn 2000010 int dp[maxn]; int main() { int t,w[5]; scanf("%d",&t); while(t--) { for(int i = 0;i < 4;i++) scanf("%d",&w[i]); memset(dp,0x3f,sizeof(dp)); dp[0] = 0; int all = 2000010; for(int i = 0;i < 4;i++) { for(int j = w[i];j < all;j++) dp[j] = min(dp[j],dp[j-w[i]] + 1); } int sum = 0,ans = 0; for(int i = 0;i <= 1000000;i++) { if(dp[i] >= 0x3f3f3f) { sum++; ans = i; } } bool mark = true; for(int i = 1000001;i <= 2000000;i++) { if(dp[i] >= 0x3f3f3f) { mark = false; break; } } if(mark) printf("%d %d ",sum,ans); else printf("%d %d ",sum,-1); } return 0; }