题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=325
本道题目使用的是0-1背包,不过貌似用0-1背包效果不怎么好,参考别人的代码险过~
我的代码: #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; //int max(int a,int b){ // return a>b?a:b; //} #define max(a,b) (a>b?a:b) //虽然这两种方法几乎相同,但是前者通不过,而后者能过通过 int dp[200100]; int num[200100]; int main(){ int half,sum,i,j; int n,v; while(~scanf("%d",&n)){ memset(num,0,sizeof(num)); memset(dp,0,sizeof(dp)); sum=0; for(i=1;i<=n;i++){ scanf("%d",&num[i]); sum+=num[i]; } // memset(dp,0,sizeof(0)); half=sum/2; for(i=1;i<=n;i++){ for(j=half;j>=num[i];j--){ dp[j]=max(dp[j],dp[j-num[i]]+num[i]); } } printf("%d\n",sum-2*dp[half]); } return 0; }