标签:
735 3 4 125 6 5 3 350 633 4 500 30 6 100 1 5 0 1 735 0 0 3 10 100 10 50 10 10
735 630 0 0
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <vector> 6 using namespace std; 7 const int maxn = 100010; 8 int dp[maxn],val[maxn],num[maxn],n,m; 9 int main() { 10 while(~scanf("%d %d",&n,&m)) { 11 for(int i = 0; i < m; ++i) 12 scanf("%d %d",num+i,val+i); 13 memset(dp,0,sizeof dp); 14 for(int i = 0; i < m; ++i) { 15 int cnt = 1; 16 while(num[i]){ 17 if(cnt > num[i]) cnt = num[i]; 18 num[i] -= cnt; 19 for(int j = n; j >= cnt*val[i]; --j) 20 dp[j] = max(dp[j],dp[j-cnt*val[i]]+cnt*val[i]); 21 cnt <<= 1; 22 } 23 } 24 printf("%d\n",dp[n]); 25 } 26 return 0; 27 }
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <vector> 6 using namespace std; 7 const int maxn = 100010; 8 int dp[maxn],val[maxn],num[maxn],cnt[maxn],n,m; 9 int main() { 10 while(~scanf("%d %d",&n,&m)) { 11 for(int i = 0; i < m; ++i) 12 scanf("%d %d",num+i,val+i); 13 memset(dp,0,sizeof dp); 14 for(int i = 0; i < m; ++i) { 15 memset(cnt,0,sizeof cnt); 16 for(int j = val[i]; j <= n; ++j) 17 if(dp[j - val[i]] + val[i]> dp[j] && cnt[j-val[i]] < num[i]){ 18 dp[j] = dp[j-val[i]]+val[i]; 19 cnt[j] = cnt[j-val[i]] + 1; 20 } 21 } 22 printf("%d\n",dp[n]); 23 } 24 return 0; 25 }
标签:
原文地址:http://www.cnblogs.com/crackpotisback/p/4442542.html