Status | In/Out | TIME Limit | MEMORY Limit | Submit Times | Solved Users | JUDGE TYPE |
---|---|---|---|---|---|---|
stdin/stdout | 3s | 8192K | 484 | 201 | Standard |
Given a specified total t and a list of n integers, find all distinct sums using numbers from the list that add up to t. For example, if t = 4, n = 6, and the list is [4, 3, 2, 2, 1, 1], then there are four different sums that equal 4: 4, 3+1, 2+2, and 2+1+1. (A number can be used within a sum as many times as it appears in the list, and a single number counts as a sum.) Your job is to solve this problem in general.
4 6 4 3 2 2 1 1 5 3 2 1 1 400 12 50 50 50 50 50 50 25 25 25 25 25 25 0 0
Sums of 4: 4 3+1 2+2 2+1+1 Sums of 5: NONE Sums of 400: 50+50+50+50+50+50+25+25+25+25 50+50+50+50+50+25+25+25+25+25+25
原来保存所有可能的代码
#include<stdio.h>
#include<algorithm>
using namespace std;
int sum,n,total,res;
int a[12];
int result[1000][12];
bool flag[12];
bool found;
int count2,count1;
bool cmp(int a,int b)
{
return a>b;
}
bool compare(int a[],int b[])
{
int i;
for(i=0;a[i]!=0&&b[i]!=0;i++)
if(a[i]!=b[i])
return false;
return true;
}
void Backtrack(int k)
{
int i;
if(total==sum)
{
found=true;
count1=0;
for(i=0;i<k;i++)
if(flag[i])
result[count2][count1++]=a[i];
result[count2][count1]=0;
count2++;
return ;
}
if(k==n)
{
return
;
}
if((total+a[k])<=sum)
{
res-=a[k];
flag[k]=true;
total+=a[k];
Backtrack(k+1);
total-=a[k];
res+=a[k];
}
if(total+res>=sum)
{
flag[k]=false;
Backtrack(k+1);
}
}
int main()
{
freopen("in.txt","r",stdin);
freopen("out1.txt","w",stdout);
while(scanf("%d%d",&sum,&n)!=EOF)
{
if(n==0)
break;
int i,j,k;
total=0;
res=0;
count2=0;
found=false;
for(i=0;i<n;i++)
{
flag[i]=false;
scanf("%d",&a[i]);
res+=a[i];
}
sort(a,a+n,cmp);
Backtrack(0);
printf("Sums of %d:/n",sum);
if(!found)
printf("NONE/n");
else
{
for(i=0;i<count2;i++)
{
for(j=0;j<=i;j++)
{
if(compare(result[j],result[i]))
break;
}
if(j>=i)
{
printf("%d",result[i][0]);
for(k=1;result[i][k]!=0;k++)
printf("+%d",result[i][k]);
printf("/n");
}
}
}
}
return 0;
}
今天讨论个数的代码
#include<stdio.h>
#include<algorithm>
using namespace std;
int n,sum,a[12],num1,num2;
bool flag;
struct t
{
int val,num;
}s[12],f[12];
bool cmp(int a,int b)
{
return a>b;
}
void dfs(int t,int x,int m)
{
int i,j,k,w;
if(t==sum)
{
w=0;
for(i=0;i<m;i++)
for(j=0;j<f[i].num;j++)
{
if(w) printf("+");
printf("%d",f[i].val);
w=1;
flag=true;
}
printf("/n");
return;
}
if(t>sum) return;
for(i=x;i<=num1;i++)
{
k=(sum-t)/s[i].val;
if(k>s[i].num) k=s[i].num;
for(j=k;j>0;j--)
{
f[m].val=s[i].val;
f[m].num=j;
dfs(t+s[i].val*j,i+1,m+1);
}
}
}
int main()
{
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
int i,t;
while(scanf("%d%d",&sum,&n))
{
flag=false;
if(n==0) break;
for(i=0;i<n;i++)
scanf("%d",&a[i]);
sort(a,a+n,cmp);
t=a[0];//记录那个值
num2=1;//记录那个个数
num1=0;//记录数组的位数
for(i=1;i<n;i++)
{
if(a[i]==t)
num2++;
else
{
s[num1].val=t;
s[num1++].num=num2;
t=a[i];
num2=1;
}
}
s[num1].num=num2;
s[num1].val=t;
printf("Sums of %d:/n",sum);
dfs(0,0,0);
if(!flag) printf("NONE/n");
}
return 0;
}