题目大意:
计算机学院分家。现在有价值为 vol 的电脑 n 台,求尽可能平分可以得到的价值。如果平分的价值不相等,先输出大的那一个。
这个题比较坑的就是,不是输入-1 结束,而是输入负数结束.......
思路:
转化成独立的物品,比如 20 2 等加成价值两件 价值 20 的物品。
然后取总价值的一半作为背包容量进行0 1 求解。
感想:
豆豆晚上给我讲的这个题说要注意状态一定要赋好。并不是很会做,但是总结之前的代码,,还是教了出来。
AC代码:
- #include<iostream>
- #include<cmath>
- #include<string.h>
- using namespace std;
- int main()
- {
- int t,n,m,i,j,k,z,sum,mid;
- int dp[100005];
- int a[100005];
- while(cin>>t)
- {
- if(t<0) break;
- memset(dp,0,sizeof(dp));
- sum=0;k=0;
- for(i=0;i<t;i++)
- {
- cin>>n>>m;
- sum+=n*m;
- for(j=0;j<m;j++)
- {
- a[k++]=n;
- }
- }
- mid=sum/2;
- for(i=0;i<k;i++)
- {
- for(j=mid;j>=a[i];j--)
- {
- dp[j]=max(dp[j],dp[j-a[i]]+a[i]);
- }
- }
- cout<<sum-dp[mid]<<" "<<dp[mid]<<endl;
- }
- return 0;
- }